我写了这个函数,它应该运行这个 for 循环,然后在最后运行回调,但它在完成循环之前一直运行回调。我读过的唯一解决方案说使用回调可以解决这个问题,但它似乎并没有太大区别。
function run(callback){
for(var i = 0; i < urls.length; i++){
request(url, function(error, resp, body){
//uses cheerio to iterate through some elements on the page
//then saves to an object for a future response
});
callback();
}
}
我会添加一个名为totaltasks
的变量和另一个名为tasksfinished
的变量。然后,当请求完成时,递增tasksfinished
,并在tasksfinished
等于 totaltasks
时调用您的回调:
function run(callback){
var totaltasks = urls.length;
var tasksfinished = 0;
// helper function
var check = function() {
if(totaltasks == tasksfinished) {
callback();
}
}
for(var i = 0; i < totaltasks; i++){
try {
request(url, function(error, resp, body) {
tasksfinished++;
check();
});
} catch(e) {
tasksfinished++;
check();
}
}
};
请求回调中移动回调函数:
function run(callback){
for(var i = 0; i < urls.length; i++){
request(url, function(error, resp, body){
//uses cheerio to iterate through some elements on the page
//then saves to an object for a future response
callback();
});
}
首先,您的代码示例缺少一些括号。 request
可能是一个异步库。因此,在函数调用中,它会向事件循环注册并立即返回。这意味着您实际上会立即调用回调,可能没有请求完成。因此,使用异步函数同步循环将不起作用。
要么使用诸如 Promises、Continuation Pass 之类的内容,要么注册一个变量,该变量跟踪是否已返回所有调用。