【问题标题】:node.js callback function at the after loop has endedafter循环的node.js回调函数已经结束
【发布时间】:2015-03-22 03:16:14
【问题描述】:

我有一个 URL 数组,我想遍历它们并获取内容。在我遍历它们并获取内容后,我希望调用一个回调函数。

我知道我可以通过异步库做到这一点,但我想在不使用任何库的情况下做到这一点。 我想要什么样的代码示例如下

['yahoo.com', 'gmail.com'].each(function(item){
//code to fetch URL content
},someCallbackFunctionToBeExecutedAtTheEndOfLoop);

【问题讨论】:

    标签: node.js


    【解决方案1】:

    这通常是您使用 Promise 所做的事情(但您需要一个库),代码如下:

    var ops = [];
    urls.forEach(function(url) {
        ops.push(fetchUrl(url));
    });
    P.all(ops).then(callback);
    
    function fetchUrl(url) {
        var defer = P.defer();
        //do stuff
        // call defer.resolve(result);
        return defer.promise;
    }
    

    如果你不想使用promise,你可以使用一个操作计数器,比如:

    var ops = urls.length;
    urls.forEach(function(url) {
        // do stuff
        ops--;
        if (ops === 0) {
            callback();
        }
    });
    

    如果你选择了 promise,我建议使用 p-promise 模块,它比 Q 优化得多。

    【讨论】:

      【解决方案2】:

      如果您想在没有任何类型的库(如异步)的情况下执行此操作,那么您必须编写自己的计数器来跟踪所有异步响应何时完成:

      var request = require('request');
      
      function loadAll(list, fn) {
          var cnt = list.length;
          var responses = [];
      
          list.forEach(function(url, index) {
              request(url, function(error, response, body) {
                  if (error) {
                      fn(error);
                  } else {
                      responses[index] = response;
                      --cnt;
                      if (cnt === 0) {
                          fn(0, responses);
                      }
                  }
              });
          })
      
      }
      
      
      loadAll(['http://www.yahoo.com', 'http://www.gmail.com'], function(err, results) {
          if (!err) {
              // process results array here
          }
      });
      

      如果您要在 node.js 中执行许多异步操作,那么获得像 Bluebird 这样的 Promise 库将为您节省大量时间。例如,我认为您可以通过以下方式执行上述操作(未经测试):

      var Promise = require("bluebird");
      var requestP = Promise.promisfy(require("request"));
      
      Promise.map(['http://www.yahoo.com', 'http://www.gmail.com'], requestP).then(function(results) {
          // process the array of results here
      });
      

      【讨论】:

        猜你喜欢
        • 2021-09-15
        • 2013-12-24
        • 2018-01-11
        • 2015-08-08
        • 2013-04-23
        • 1970-01-01
        • 1970-01-01
        • 2018-09-01
        • 2018-09-08
        相关资源
        最近更新 更多