以前我在这里回答了一个非常类似的问题很长一段时间:协调在node.js的并行执行。
然而,时代在进步。从那时起,一个非常好的库出现了,promise 设计模式得到了充分的探索,甚至标准化到了语言中。如果您想了解如何使用原始代码完成此操作,请单击上面的链接。如果你只是想代码阅读..
异步.js
该async.js图书馆已基本实现的代码在上面的链接。使用异步,您编写的代码将如下所示:
var listOfAsyncFunctions = [];
for (var i = 0; i < 10; i++) {
(function(n){
// Construct an array of async functions with the expected
// function signature (one argument that is the callback).
listOfAsyncFunctions.push(function(callback){
// Note: async expects the first argument to callback to be an error
someAsyncFunction({someParam:n}, function (data) {
callback(null,data);
});
})
})(i); // IIFE to break the closure
}
// Note that at this point you haven't called the async functions.
// Pass the array to async.js and let it call them.
async.parallel(listOfAsyncFunctions,function (err,result) {
console.log(result); // result will be the same order as listOfAsyncFunctions
});
然而,async.js 的作者所做的远不止这些。Async 也有类似数组的功能操作:each、map、filter、reduce。它使异步处理数组变得简单并使代码更易于理解:
var listOfParams = [];
for (var i = 0; i < 10; i++) {
// Construct an array of params:
listOfParams.push({someParam:i});
}
async.map(listOfParams,someAsyncFunction,function (err,result) {
console.log(result);
});
async 为您提供的另一件事是处理异步任务的不同算法。举例来说,您想抓取一个网站,但不希望他们禁止您的 IP 地址以向其服务器发送垃圾邮件。您可以使用async.series()
而不是parallel
一次处理一个任务:
// Set-up listOfAsyncFunctions as above
async.series(listOfAsyncFunctions,function (err,result) {
console.log(result); // result will be the same order as listOfAsyncFunctions
});
或者,如果您想一次处理 3 个任务:
async. parallelLimit(listOfAsyncFunctions, 3, function (err,result) {
console.log(result); // result will be the same order as listOfAsyncFunctions
});
Promise.all()
该Promise.all()
方法的工作方式与async.parallel()
仅适用于 Promise 的方式类似。您构建了一个Promise数组,然后将它们传递给Promise.all()
:
var listOfPromises = [];
for (var i = 0; i < 10; i++) {
// Construct an array of promises
listOfPromises.push(somePromiseFunction({someParam:i}));
}
Promise.all(listOfPromises).then(function(result){
console.log(result);
});