是否可以在async.waterfall
内使用async.series
?
例如,假设我有一个模块api
,它有两个方法api.get
和api.post
,然后是另一个从S3存储桶下载图像的模块,调整它的大小,然后将其放回S3存储桶resizer
。
我想使用api.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
之后死亡。为什么呢?
答案 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
就足够了。