在循环中使用 async.series 或瀑布

use async.series or waterfall in a loop

我刚开始学习使用异步,我想做这样的事情:

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

事实上,我希望 getListOfArguments 读取一些列表并将其保存在全局范围内,然后我想遍历 doSomething 函数以获取数组的每个元素作为输入并移动到下一个元素 仅当第一个完成(因此使用异步!),但这似乎不起作用。

有人能帮帮我吗?

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

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');
}

尝试这样的事情。

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


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



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

这里最好的选择是 async.whilst 你的情况。

第一个参数是测试函数。只要第一个参数 return 为真,第二个参数就会 运行。第三个参数会在第一个参数return之后运行为false或者出错。

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

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