簡體   English   中英

在Node.js中使用異步瀑布進行函數迭代

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM