Javascript Node.js中异步瀑布函数迭代
我试图从某个url获取资源,该资源被分隔为多个页面,页面数超过500,但必须保证资源的顺序,因此我决定使用异步模块Javascript Node.js中异步瀑布函数迭代,javascript,node.js,asynchronous,Javascript,Node.js,Asynchronous,我试图从某个url获取资源,该资源被分隔为多个页面,页面数超过500,但必须保证资源的顺序,因此我决定使用异步模块 function getData(page, callback){ var url = "http://someurl.com/document?page="+page; // get data from the url ... // when success, callback(); }; 所以,上面的函数是从某个url获取资源,我必须多次迭代
function getData(page, callback){
var url = "http://someurl.com/document?page="+page;
// get data from the url ...
// when success,
callback();
};
所以,上面的函数是从某个url获取资源,我必须多次迭代此函数,但我不知道如何使用异步瀑布迭代此函数。我应该推动迭代的点是什么
async.waterfall([
// page 1
function(callback){
getData(1, function(){
callback(null);
});
},
// page 2
function(callback){
getData(2, function(){
callback(null);
});
},
// page 3, 4, 5..... 100, ... 500
],function(err, result){
if(err) return next();
console.log('finish !');
});
你为什么不使用承诺:
function getData(page, callback){
var url = "http://someurl.com/document?page="+page;
// var request = call to get data from the url ...
return request;
};
var promises = [];
for (var page = 1; page < totalPages; page++) {
promises.push(getData(page));
}
Promise.all(promises).then(function (listOfResults) {
// Do callback here
});
是关于承诺的更多信息为什么不使用承诺:
function getData(page, callback){
var url = "http://someurl.com/document?page="+page;
// var request = call to get data from the url ...
return request;
};
var promises = [];
for (var page = 1; page < totalPages; page++) {
promises.push(getData(page));
}
Promise.all(promises).then(function (listOfResults) {
// Do callback here
});
有关承诺的更多信息,请参见您可以在的同时使用async的。您可以在的同时使用async的。如果您想使用
async
、async.map()
和async.mapLimit()
是更好的选择,因为它们将迭代对象
并行应用于每个项,并保证结果数组与原始集合的顺序相同
async.mapLimit(_.range(1, 500), 10, getData, function (err, results) {
// do something with results
});
上面的代码意味着从第1页到第500页获取数据,一次不超过10个异步操作
。.range(1500)
是一个来自下划线的函数,用于生成数组[1,2,3,…,500]
。如果您不喜欢在项目中使用下划线
,您可以简单地重写它,例如:
function range(lower, upper) {
return Array.apply(null, Array(upper - lower + 1))
.map(function (_, i) { return lower + i; });
}
如果确实要使用async
,async.map()
和async.mapLimit()
是更好的选择,因为它们将iteratee
并行应用于每个项,并保证结果数组与原始集合的顺序相同
async.mapLimit(_.range(1, 500), 10, getData, function (err, results) {
// do something with results
});
上面的代码意味着从第1页到第500页获取数据,一次不超过10个异步操作
。.range(1500)
是一个来自下划线的函数,用于生成数组[1,2,3,…,500]
。如果您不喜欢在项目中使用下划线
,您可以简单地重写它,例如:
function range(lower, upper) {
return Array.apply(null, Array(upper - lower + 1))
.map(function (_, i) { return lower + i; });
}
我甚至不会对
使用,也不会使用递归。我甚至不会对
使用,也不会使用递归。承诺在这方面还不够好。Promises仅将promise.all
作为一种流控制方法来实现,它相当于async.parallel
。只有这样。另一方面,async.js库提供了许多其他算法来处理异步函数:并行、串行、瀑布、while(while)、during、until等。如果您更喜欢promise设计模式,则async.js的promisified版本称为async qPromises,这还不够好。Promises仅将promise.all
作为一种流控制方法来实现,它相当于async.parallel
。只有这样。另一方面,async.js库提供了许多其他算法来处理异步函数:并行、串行、瀑布、while(while)、during、until等。如果您喜欢promise设计模式,则有一个名为async-q的async.js的预期版本