繁体   English   中英

Node.js的循环回调问题

[英]Nodejs for loop callback issues

我编写了此函数,该函数应先运行此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 Passing之类的东西,或注册一个变量,该变量可跟踪是否已返回所有呼叫。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM