【问题标题】:What is a SIMPLE implementation of async.series?什么是 async.series 的简单实现?
【发布时间】:2026-01-13 02:55:02
【问题描述】:

我有两个功能:

function one(next){
  Users.find({}, function(err, docs){
    if( err)
      next( err );
    } else {
      next( null );
    }
  });
}

function two(next){
  Something.find({}, function(err, docs){
    if( err)
      next( err );
    } else {
      next( null );
    }
  });
}

我可以使用异步库:

async.series( [one, two], function( err ){
  ...
});

这里,如果 one() 返回 err,则立即调用回调(设置 err)。 什么是easy,async.series 的 BASIC 实现? 我查看了库 async 的代码(这太棒了),但它是一个用来做很多事情的库,我在使用它时遇到了很大的麻烦。

你能告诉我一个简单的 async.series 实现吗?它会简单地一个接一个地调用函数,并且——如果其中一个调用带有错误的回调——调用最终的回调并设置err

谢谢...

佣兵。

【问题讨论】:

    标签: node.js asynchronous


    【解决方案1】:

    一个实现是这样的:

     function async_series ( fn_list, final_callback ) {
         // Do we have any more async functions to execute?
         if (fn_list.length) {
             // Get the function we want to execute:
             var fn = fn_list.shift();
             // Build a nested callback to process remaining functions:
             var callback = function () {
                 async_series(fn_list,final_callback);
             };
             // Call the function
             fn(callback);
         }
         else {
             // Nothing left to process? Then call the final callback:
             final_callback();
         }
     }
    

    以上代码不处理结果或错误的处理。要处理错误,我们可以简单地检查回调中的错误条件,并在错误时立即调用最终回调:

     function async_series ( fn_list, final_callback ) {
         if (fn_list.length) {
             var fn = fn_list.shift();
             var callback = function (err) {
                 if (err) {
                     final_callback(err); // error, abort
                 }
                 else {
                     async_series(fn_list,final_callback);
                 }
             };
             fn(callback);
         }
         else {
             final_callback(null); // no errors
         }
     }
    

    通过在闭包中跟踪结果数组或将其传递给下一次对 async_series 的调用,可以类似地处理结果。

    请注意,最终的最终回调可以假定没有错误,因为它是通过 if(err)(else)async_series 调用到达那里的。

    【讨论】:

    • AAaaahhhhhhhhhhhhhhh 我明白了,100%。哇,谢谢 。我的小脑袋一直在想next 参数必须是下一个回调......但当然不是!它需要是一个快速的功能,可以简单地继续工作!一旦你看到它就很明显......谢谢!
    • 确实需要一些时间来适应编写面向事件的代码。但是一旦你习惯了传递和返回函数(我的意思是真正适应它,而不仅仅是理解它),一切都会变得有意义,你就不再考虑 if..else 和循环了。
    • 有什么提示可以加快“适应它”阶段吗?我觉得我真的很挣扎......
    • 只是通常的 10000 小时规则。如果你的讲师在大学里教你 Lisp 或 Haskell 也会有帮助(不幸的是我没有教你)。继续编码并阅读其他人的代码。就像我们学习口语一样。当我们开始学习一门语言时,我们通常不会得到该语言的笑话。然后在某一时刻,我们充分理解它并开始大笑。
    • 我从来没有学过 lisp 和 Haskell,现在我明白了……也许我应该学习它们?或者,是否有资源可以解释常见的“模式”,以便优雅地教导我的大脑如何根据异步函数进行思考?我对传递和返回函数非常满意,只是我在循环和 ifs 方面陷入了思考......