异步系列中的异步瀑布

Async waterfall inside async series

是否可以在 async.series 中使用 async.waterfall

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

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

到目前为止我有这样的东西:

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 之后消失。为什么?

你不能在 series 中间调用 waterfall,主要是因为 waterfall 没有 return 任何事物和系列期望函数作为任务,所以你正在打破链条。

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

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

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

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) {
  ......
});