如何在node.js中的async.parallel中进行循环

时间:2017-07-24 13:39:47

标签: node.js asynchronous

我有一个如下代码段。

async.parallel({

    foo: function(call) {

      request.get('...?node=foo', function (error, response, body) {

        var last=JSON.parse(body);
        call(null,last.data.result);
      });

    },
    bar: function(call) {
      request.get('...node=bar', function (error, response, body) {

        var last=JSON.parse(body);
        call(null,last.data.result);
      });
    }
  }, function(err, results) {
    callback(results)
  });

但我希望循环...也就是说,如下所示。

var node = ['foo', 'bar'];
async.parallel({

  for (var i = 0; i < node.length; i++) {
    node[i]: function(call) {

      request.get('...?node=' + node[i] + '', function(error, response, body) {

        var last = JSON.parse(body);
        call(null, last.data.result);
      });

    }
  }

}, function(err, results) {
  callback(results)
});

它不起作用......如何制作它? 你能救我吗?

1 个答案:

答案 0 :(得分:1)

您有两种选择之一。一个是阅读async.map()的文档,这将是使用async的更规范的方法。

这看起来像这样:

async.map(['foo', 'bar'], function (node, callback) {
  request.get('...?node=' + encodeURIComponent(node), function (error, response, body) {
    if (error) return callback(error)
    var last = JSON.parse(body)
    callback(null, last.data.results)
  })
}, function (error, results) {
  // handle error
  callback(results)
})

您的第二个选择是将Promise.all()与同步Array#map()一起使用,完全删除async的依赖关系,但您可能需要像{{3}这样的填充。直到Promise被用于更大比例的浏览器。

以下是您如何使用原生Promise实现后一种解决方案:

Promise.all(['foo', 'bar'].map(function (node) {
  return new Promise(function (resolve, reject) {
    request.get('...?node=' + encodeURIComponent(node), function (error, response, body) {
      if (error) return reject(error)
      var last = JSON.parse(body)
      resolve(last.data.result)
    })
  })
})).then(function (results) {
  callback(results)
}).catch(function (error) {
  // handle error
})