用于循环回调问题的 Nodej

Nodejs for loop callback issues

本文关键字:Nodej 问题 回调 循环 用于      更新时间:2023-09-26

我写了这个函数,它应该运行这个 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 之类的内容,要么注册一个变量,该变量跟踪是否已返回所有调用。