【问题标题】:Async waterfall inside async series异步系列中的异步瀑布
【发布时间】:2015-07-18 08:05:01
【问题描述】:

是否可以在async.series 内部使用async.waterfall?

例如,假设我有一个模块api,它有两种方法,api.get 和api.post,然后另一个模块从 S3 存储桶下载图像,调整其大小,然后将其放回 S3桶,resizer.

我想用api.get 发出一个get 请求并获得一个oauth 令牌,然后触发resizer,然后才触发api.post。我不需要在api 和resizer 之间传递任何结果。

到目前为止,我有这样的事情:

async.series([
  function get (callback) {
    api.get(callback)
  },
  async.waterfall([
    function download (callback) {
      S3.get({...}, callback);
    },
    function transform (response, callback) {
      gm(..)
        .resize(....)
        .toBuffer(...) {
          S3.put({...})
        }, callback;
   ]),
   function post (callback) {
     api.post(callback)
   }
], function (err) {
      ......
});

但它永远不会触发api.post 并在S3.put 之后死亡。为什么?

【问题讨论】:

  • 以后请发布实际语法上有效的 JavaScript。解析伪代码令人不快,并且会破坏语法突出显示和自动格式化工具。如果您愿意,您可以组成占位符变量名称,但 settings 是有效的 javascript,而 .... 不是。
  • @PeterLyons 可以。对此感到抱歉。

标签: node.js asynchronous


【解决方案1】:

绝对有可能。我一直在做同样的事情。它可能会变得有点混乱,因此需要注意。

您的代码未被调用的原因是您需要将瀑布封装在另一个函数中。目前,您的外部 async.series 将尝试调用 async.waterfall 的结果,这可能不会返回函数。

async.series([
  function get(callback) {
    api.get(callback)
  },
  function(callback) {
    async.waterfall([
      function download(callback1) {
        S3.get({...
        }, callback1);
      },
      function transform(response, callback1) {
          //transform stuff here
          return callback1();
      },
      function post(callback1) {
        api.post(callback1)
      }
    ], callback);
  }
], function(err) {
  ......
});

【讨论】:

  • 正如@Ivan 在代码中所说的那样,您不需要在 async.series 中使用瀑布。 Async.waterfall 和 async.series 本质上是一回事:它们都按顺序运行一组异步函数。但是,我在 async.series 或 async.waterfall 中使用了 async.parallel。如果您需要按顺序运行一堆“步骤”并且其中一个步骤有多个要并行运行的子步骤,这将非常有用。
  • 但是如果我只使用async.series,正如@ivan 所说,那么我如何将S3.get 的结果传递给我的transform 函数?
  • 如果您需要将每个函数的结果传递给 async.waterfall 的下一个函数,那么请使用它来代替 async.series。 async.waterfall 和 async.series 之间的唯一区别是瀑布将每个函数的结果传递给下一个。
  • @officert 是对的,您可以按照他的方式称呼它,但是将其包装在一个函数中,就像系列期望的那样作为其链中的一个元素。我不想说不可能,我是这么说的
【解决方案2】:

你不能在series 中间调用waterfall,主要是因为waterfall 不返回任何东西并且系列期望一个函数作为任务,所以你打破了链条。

对于您发布的示例,我不明白您为什么需要两者,使用series 应该就足够了。

【讨论】:

    猜你喜欢
    • 2018-10-28
    • 2018-11-13
    • 2020-09-06
    • 2019-01-02
    • 2015-04-28
    • 1970-01-01
    • 2014-10-09
    • 2016-01-20
    • 1970-01-01
    相关资源
    最近更新 更多