2013-12-02 2 views
0

Это мой код:Как выполнить блоки функций?

var testStacks = new Array(); 

function test(elem) { 
    console.log(elem); 
    ... asynch operations 
} 

testStacks.push(test("hello 0")); 
testStacks.push(test("hello 1")); 
testStacks.push(test("hello 2")); 
testStacks.push(test("hello 3")); 
testStacks.push(test("hello 4")); 

// init first 3 functions 
testStacks[0]; 
testStacks[1]; 
testStacks[2]; 

, и я хочу, чтобы выполнить 3 функции во время. Так hello 0, hello 1 и hello 2 начать вместе в начале. Затем, после завершения одной функции (они выполняют асинхронные операции), она должна вызывать следующий (еще не выполненный) из массива. И так далее ...

Кажется, что testStacks[0] ничего не делает, и когда я нажимаю функцию, она будет выполнена.

Как это сделать? (Я хочу избежать setInterval()).

+0

Посмотрите на ** Promise.all() **. https://github.com/then/promise – Florent

ответ

2

Простым подходом может быть нажатие как функции И параметров.

var testStacks = new Array(); 

function test(elem) { 
    console.log(elem); 
    ... asynch operations 
} 

testStacks.push({func: test, param: "hello 0"}); 
testStacks.push({func: test, param: "hello 1"}); 
testStacks.push({func: test, param: "hello 2"}); 
testStacks.push({func: test, param: "hello 3"}); 
testStacks.push({func: test, param: "hello 4"}); 

// init first 3 functions 
testStacks[0].func(testStacks[0].param); 
testStacks[1].func(testStacks[1].param); 
testStacks[2].func(testStacks[2].param); 

Это может быть обобщено и очищено во многих отношениях, конечно, но должно дать вам базовую идею.

+0

Но как насчет того, если я хочу поп и выполнить функцию? Поэтому у меня больше нет индекса (что может привести к путанице между асинхронной операцией). – markzzz

+0

Используя pop, вам нужно будет соблюдать порядок, от верхнего индекса до 0, Пример: 'var f = testStacks.pop(); f.func (f.param); f = testStacks.pop(); f.func (f.param); f = testStacks.pop(); f.func (f.param); ' –

+0

Вы можете просто использовать' array.splice (index, 1) 'сразу после выполнения. Но это может испортить цикл над массивом, если вы не будете осторожны. – Aioros

2

Вы выполняете функцию и нажимаете возвращаемое значение. Вместо этого нажмите функцию:

testStacks.push(function(){ test("hello 0"); }); 
1

Независимо от того, какое решение вы выберете, вам понадобится нечто вроде стороннего объекта для управления текущим стеком вызовов и способ уведомления об этом объекте всякий раз, когда операция завершена. Что касается следующего (довольно грязного) кода, я решил использовать простой обратный вызов вызывается из функции test:

var Stack = function (maxCalls, stack) { 
    this.ongoing = 0; 
    this.maxCalls = maxCalls; 
    Array.prototype.push.apply(this, stack); 
    this.next(); // starts immediately 
}; 

Stack.prototype = Object.create(Array.prototype); 

Stack.prototype.next = function() { 
    var me = this; 
    while (this.length && this.ongoing < this.maxCalls) { 
     this.ongoing++; 
     // calls the next function 
     // passing a callback as a parameter 
     this.shift()(function() { 
      me.ongoing--; 
      me.next(); 
     }); 
    } 
}; 

Смотрите эту демонстрацию для случая использования: http://jsfiddle.net/wared/5eu8b/. Как вы можете видеть, функции вызывается один за другим в первом в первом порядке, но они завершаются в любом порядке.

Надеюсь, это может помочь как-то :)

Смежные вопросы