【问题标题】:What is the difference between async.waterfall and async.seriesasync.waterfall 和 async.series 有什么区别
【发布时间】:2012-03-04 17:48:03
【问题描述】:

nodejs 异步模块:https://github.com/caolan/async 提供了 2 个类似的方法,async.waterfallasync.series

它们有什么区别?

【问题讨论】:

    标签: javascript node.js asynchronous node-async


    【解决方案1】:

    似乎async.waterfall 允许每个函数将其结果传递给下一个函数,而async.series 将所有结果传递给最终回调。在更高的层次上,async.waterfall 将用于数据管道(“给定 2,将其乘以 3,加 2,然后除以 17”),而 async.series 将用于必须按顺序执行的离散任务,但在其他方面是分开的。

    【讨论】:

    • 这两个函数中的任何一个都可以返回值吗?我读过这是可能的,但我在文档中的任何地方都找不到相关信息。
    • @AndersonGreen:不。查看库源代码,waterfallseries 都没有返回值。预计无论结果如何,都将在可选的回调参数中使用。
    • 上面的答案可能回到 2012 年是正确的,但正确的答案与下一个相同,即: series() 因为它被命名为 ALL 结果作为传递给 Final 回调的系列,瀑布是传递给最终回调的最后一个结果。见Mozilla Developer
    【解决方案2】:

    两个函数都将每个函数的返回值传递给下一个函数,然后在完成时调用主回调,如果发生错误,则传递其错误。

    不同之处在于async.series(),一旦系列完成,会将所有结果传递给主回调。 async.waterfall() 只会将最后调用的函数的结果传递给主回调。

    【讨论】:

    • 这应该是答案;-)
    • @Mario "两个函数都传递了前一个函数的回调" OR "两个函数都传递了前一个函数的结果" ?
    • @user1451111,结果,大声笑...我确定我第一次写了...
    【解决方案3】:

    async.waterfall() 正在处理 action that relies on the previous outcome

    async.series() 正在处理一个想要see all the result at the end 的操作

    【讨论】:

    • 制作精美的图片。是您自己创建的还是在其他地方获得的?
    • 你应该把图片放在答案中,人们可能会错过它们
    【解决方案4】:

    我认为 async.waterfall 是有害的,因为一旦编写就很难重构并且容易出错,因为如果您提供更多参数,其他函数会大大改变签名。

    我强烈推荐 async.autoInject 作为 async.waterfall 的绝佳替代品。 https://caolan.github.io/async/autoInject.js.html

    如果您确实选择使用 async.waterfall,我建议将所有内容存储在一个对象中,这样您的函数就不必更改长度/签名,如下所示:

    警告:这是一个糟糕的模式

    async.waterfall([
      cb => {
        cb(null, "one", "two");
      },
      (one, two, cb) => {
        cb(null, 1, 2, 3, 4);
      },
      (one,two,three,four,cb) => {
         // ...
      }
    ])
    

    不要按照上述方式进行操作。这是更好的模式

    async.waterfall([
      cb => {
        cb(null, {one:"one", two:"two"});
      },
      (v, cb) => {
        cb(null, [1, 2, 3, 4]);
      },
      (v,cb) => {
         // ...
      }
    ])
    

    这样你就不会为了确保函数参数的长度正确而费尽心思。第一个函数只接受一个 arg - 回调。所有其余的都应该接受两个参数 - 一个值和回调。坚持这个模式,你就会保持清醒!

    【讨论】:

      猜你喜欢
      • 2014-10-22
      • 2016-10-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-10-02
      • 2011-12-12
      • 2010-09-16
      • 2012-03-14
      相关资源
      最近更新 更多