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。但是当然,如果值来自某个地方,则需要首先检查它。对某些人来说,相应地修改这个例子应该不会太难。