异步系列内的异步瀑布

时间:2015-05-07 16:06:07

标签: node.js asynchronous

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

例如,假设我有一个模块api,它有两个方法api.getapi.post,然后是另一个从S3存储桶下载图像的模块,调整它的大小,然后将其放回S3存储桶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之后死亡。为什么呢?

2 个答案:

答案 0 :(得分:8)

绝对有可能。我一直在做同样的事情。它可能会有点混乱,所以这是值得注意的。

您的代码未被调用的原因是您需要将瀑布包装在另一个函数中。目前您拥有外部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) {
  ......
});

答案 1 :(得分:1)

你不能在waterfall的中间调用series,主要是因为waterfall没有返回任何内容而系列期望函数作为任务,所以你打破了链。

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