在循环中使用async.series或waterfall

时间:2016-11-17 13:02:07

标签: node.js asynchronous async.js

我只是学习使用异步,我想做这样的事情:

var listOfArguments = [];
async.waterfall([
getTheListOfArguments,
function(callback) {
  if (listOfArguments.lengh > 0) {
    doSomething(listOfArguments.shift());
  } else {
    callback(null, listOfArguments);
  }
}
], function(err, res) {
})

实际上我希望getListOfArguments读取一些列表并将其保持全局,然后我想循环遍历doSomething函数以将数组的每个元素作为输入并仅在完成时继续移动到下一个元素 与第一个(因此使用async!),但这似乎不起作用。

有人可以帮我吗?

3 个答案:

答案 0 :(得分:0)

虽然我不太确定你想要实现的目标,但我相信你需要的代码可能看起来更像这样

var listOfArguments = [];

getTheListOfArguments(function(){
    // listOfArguments now contains some items, let's process it
    if(listOfArguments.length) doSomething();
});

function doSomething() {

    var item = listOfArguments.pop();

    // ... do your thing here

    // if we still have some items in the listOfArguments array doSomething again
    if(listOfArguments.length) return doSomething();

    // we are done, do something here
    console.log('Done');
}

答案 1 :(得分:0)

尝试这样的事情。

var listOfArguments = [];
var listOfTasks = [];


getTheListOfArguments(function(){
  listOfArguments.forEach(function(arg){
     listOfTasks.push(doSomething.bind(null, arg))
 });
});



async.series(listOfTasks, function(err, res) {
})

答案 2 :(得分:0)

在您的情况下,最好的选择是async.whilst。 第一个参数将是测试功能。只要第一个参数返回true,第二个参数就会运行。第一个参数返回false或发生错误后,第三个参数将运行。

在doSomething函数的每次迭代之后都会检查第一个参数。

async.whilst(
    function() { return list_of_arguements.length > 0; },
    function(callback) {
        doSomething(list_of_arguements,(err, list_of_arguements)=>{
            if(err){
                callback(err,null)
            }
            list_of_arguements.shift();
            callback(null,list_of_arguements);
        });
    },
    function (err, list_of_arguements) {
        if(err){
            console.log(error)
        }
        else{
            // list of arguements is empty here
            console.log(list_of_arguements.length) //logs 0
        }
    }
);