如何执行功能块?

时间:2013-12-02 11:25:00

标签: javascript

这是我的代码:

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 0hello 1hello 2一起开始。比如,一旦一个函数完成(它们执行异步操作),它必须从数组中调用下一个(尚未执行)。等等...

似乎testStacks[0]什么都不做,当我按下该功能时,它将被执行。

我该怎么做? (我想避免setInterval())。

3 个答案:

答案 0 :(得分:2)

您正在执行该功能并按下返回值。推送一个功能:

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

答案 1 :(得分: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);

当然,这可以通过多种方式进行推广和清理,但应该给你一个基本的想法。

答案 2 :(得分: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/。如您所见,函数以先进先出的方式一个接一个地调用,但它们以任何顺序完成。

希望它能以某种方式提供帮助:)