我编写了此函数,该函数应先运行此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();
    }
  }
};

08-04 23:04