我有一个如下代码段。
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)
});
它不起作用......如何制作它? 你能救我吗?
答案 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
})