2016-03-10 40 views
0

我写了这个函数,它应该运行这个for循环,然后在最后回调,但它在循环完成之前一直运行回调。我读过的唯一解决方案是使用回调来解决这个问题,但它似乎没有太大区别。Nodejs 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(); 
    } 
} 
+0

什么是“做一些东西”异步? –

+0

是的,现在有一个在循环中运行的请求来更新代码。 – txnnxr

回答

1

我想补充一个名为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(); 
    } 
    } 
}; 
+0

这个作品完美!谢谢您的帮助。 – txnnxr

+0

不客气! –

0

您需要将请求回调的内部回调函数:

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(); 
    }); 

} 
+0

但是当我这样做时,它会像for循环一样多次运行回调,并且当for循环内的所有内容都完成时,我需要触发回调。 – txnnxr

0

首先你所有的代码示例中缺少一些支架。 request可能是一个异步库。所以在它的函数调用它注册事件循环并立即返回。意思是你实际上立即调用回调,可能没有完成请求。因此,与异步函数同步循环将无法工作。

可以使用类似Promises,Continuation Passing或者注册一个跟踪所有调用是否已经返回的变量。