让我说我有以下代码,
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,所以如果我错误地使用任何术语,请纠正我。
答案 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
}