Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/39.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/302.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript Node.js中异步瀑布函数迭代_Javascript_Node.js_Asynchronous - Fatal编程技术网

Javascript Node.js中异步瀑布函数迭代

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获取资源,我必须多次迭代

我试图从某个url获取资源,该资源被分隔为多个页面,页面数超过500,但必须保证资源的顺序,因此我决定使用异步模块

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的预期版本