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

Javascript 在每次回调后调用下一次迭代,javascript,node.js,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 } } } someAs

假设我有以下代码

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还比较陌生,所以如果我错误地使用了任何术语,请纠正我。

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

相反,您可以将代码放入函数中,并在满足条件时再次调用函数本身

例如:

function someFunction() {
    var i = 0;
    function step() {
        if (i < 10) {
            someAsyncProcess(someField, function(err, data) {
                i++;
                step();
            });
        }
    }
    step();
}
有相当多的库提供了现成的解决方案。您可能还想了解一下一般情况。

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

相反,您可以将代码放入函数中,并在满足条件时再次调用函数本身

例如:

function someFunction() {
    var i = 0;
    function step() {
        if (i < 10) {
            someAsyncProcess(someField, function(err, data) {
                i++;
                step();
            });
        }
    }
    step();
}
有相当多的库提供了现成的解决方案。您可能还希望了解一般情况。

使用有助于您回报承诺的工具。您可以通过以下方式使用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);
}
如果您发现任何语法错误,请更正。希望它有帮助。

使用它可以帮助你回报承诺。您可以通过以下方式使用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);
}

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

您需要使用函数递归的替换while循环迭代

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

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

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

while是同步的。您不能让它等待异步进程完成。在这种情况下,您不能使用while循环。还有其他选择吗?递归、带承诺的递归、rxjs由于JavaScript的异步特性,JavaScript本质上不是异步的。它没有异步性质-某些函数是异步的。如果你这样看的话,你不会想要一个while循环。您真正想要的是调用异步函数10次。现在,将这一点与以下事实结合起来:异步函数完成后要完成的所有工作都需要在其回调中完成。while是同步的。您不能让它等待异步进程完成。在这种情况下,您不能使用while循环。还有其他选择吗?递归、带承诺的递归、rxjs由于JavaScript的异步特性,JavaScript本质上不是异步的。它没有异步性质-某些函数是异步的。如果你这样看的话,你不会想要一个while循环。您真正想要的是调用异步函数10次。现在,将这一点与以下事实结合起来:异步函数完成后要完成的所有工作都需要在其回调中完成10@Sajan:当然可以,但我在这里被初始化为0,小于10。没关系,但他正在寻找一个while循环替代方案,“i”值可以是任何值,因此在调用function@Sajan:在他们的示例中,他们还使用0初始化i。但是当然,如果值来自某个地方,则需要首先检查它。对某些人来说,相应地修改示例应该不会太难。如果i值大于,这将在初始循环中调用异步函数10@Sajan:当然可以,但是我在这里被初始化为0,小于10。没关系,但他正在寻找一个while循环替代方案,“i”值可以是任何值,因此,在调用function@Sajan:在他们的示例中,他们还使用0初始化i。但是当然,如果值来自某个地方,则需要首先检查它。对某些人来说,相应地修改这个例子应该不会太难。