[英]Function iteration with Async waterfall in Node.js
我試圖從某個URL獲取資源,該資源被分成多個頁面,頁面數超過500,但是必須保證資源的順序,因此我決定使用Async模塊。
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 !');
});
您為什么不使用Promises:
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
});
只要確保您發送get請求的方法返回一個諾言即可。 如果沒有,您可以使用如下函數:
function usesCallback(data, callback) {
// Do something with data
callback();
}
function makePromise(data) {
return new Promise(function (resolve, reject) {
usesCallback(data, resolve);
});
}
這是有關Promises的更多信息
如果確實要使用async
,則async.map()
和async.mapLimit()
是更好的選擇,因為它們將iteratee
並行應用於每個項目,並保證結果數組與原始集合的順序相同。
async.mapLimit(_.range(1, 500), 10, getData, function (err, results) {
// do something with results
});
上面的代碼意味着從第1頁到第500頁獲取數據,一次不超過10個異步操作。
_.range(1, 500)
是underscore
生成數組[1, 2, 3, ..., 500]
的函數。 如果您不喜歡在項目中使用underscore
,則可以簡單地重寫它,例如:
function range(lower, upper) {
return Array.apply(null, Array(upper - lower + 1))
.map(function (_, i) { return lower + i; });
}
您可以使用異步的,而這在這里檢查 。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.