【问题标题】:use async.series or waterfall in a loop在循环中使用 async.series 或瀑布
【发布时间】:2017-04-01 00:58:14
【问题描述】:

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

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

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

谁能帮帮我?

【问题讨论】:

  • 并且doSomething 是否返回了一个承诺,因为它肯定是异步的,否则就不需要这样做了吗?

标签: node.js asynchronous async.js


【解决方案1】:

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

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

【讨论】:

  • 一次可以运行的函数数量可能存在最大堆栈限制。有没有其他选择。
  • @FlynSequeira 在上面的示例中,您一次只运行一个 doSomething 函数。如果你需要做一些异步的事情,那么你可能想在所有异步函数完成后调用 doSomething 函数。我看不出有任何理由达到任何堆栈限制。
  • 哦,是的。因为回归。
【解决方案2】:

试试这样的。

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


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



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

【讨论】:

    【解决方案3】:

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

    第一个参数是测试函数。只要第一个参数返回 true,第二个参数就会运行。第三个参数将在第一个参数返回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
            }
        }
    );
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-10-31
      • 2017-11-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多