在每次回调后调用下一次迭代

时间:2017-01-10 06:52:45

标签: javascript node.js

让我说我有以下代码,

function someFunction(){
    var i = 0;
    while (i < 10){
        someAsyncProcess(someField, function(err, data){
            i++;
            // i want the next iteration of the while loop to occur after this
        }
    }
}

someAsyncProcess运行,并递增'i'。

但是,由于JavaScript的异步特性,while循环在i = 10之前运行了数千次。如果我希望while循环运行10次,那该怎么办?如果我希望while循环仅在回调函数执行完毕后执行内部代码,该怎么办呢?

是否可以在没有setTimeout函数的情况下执行此操作?

请注意我仍然是相对较新的JavaScript,所以如果我错误地使用任何术语,请纠正我。

3 个答案:

答案 0 :(得分:3)

while是同步的。你不能让它等到异步过程完成。在这种情况下,您不能使用while循环。

相反,如果符合条件,您可以将代码放入函数中并再次调用函数。

示例:

function someFunction() {
    var i = 0;
    function step() {
        if (i < 10) {
            someAsyncProcess(someField, function(err, data) {
                i++;
                step();
            });
        }
    }
    step();
}

有很多图书馆为此提供现成的解决方案。您可能还想查看promises

答案 1 :(得分:0)

使用node package q来帮助您返回承诺。您可以使用q。

以下列方式实现相同的目的
var q = require('q');
function someFunction(){

    var promises = []    
    var i = 0;
    while (i < 10) {
        promises.push(function() {
            i++;
            //write code here for using current value of i
        })
    }
    return q.all(promises);
}

您可以调用someFunction(),如下所示

someFunction().then(function(arrayOfResponseFromEachPromiseFunction) {
    console.log(JSON.stringify(arrayOfResponseFromEachPromiseFunction, null, 4));
}).catch(function(err){
    console.log(err);
}).done();

如果您发现任何语法错误,请纠正。希望它有所帮助。

答案 2 :(得分:0)

你需要使用带有函数递归的while while循环迭代

function someFunction() {
    var i = 0;
    (function asyncWhile() { 
        if (i < 10) {
            someAsyncProcess(someField, function(err, data) {
                //You code here
                i++;
                asyncWhile(); 
            });
        }
    })(); //auto invoke
}