如何在 async.parallel in node.js 中制作 for 循环



我有一个如下所示的代码片段。

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)
});

它不起作用...怎么做? 你可以帮我吗?

您有两种选择之一。一种是阅读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的依赖关系,尽管您可能需要像bluebird这样的polyfill,直到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
})

最新更新