我正在使用异步模块来帮助创建依赖于异步创建的其他对象的对象。异步创建的对象具有针对它们运行的验证,最终返回promise。我遇到的问题是“最终”异步回调似乎永远不会被调用,我无法弄清楚原因。
示例代码:
function construct(self, opts) {
async.parallel({
venue: function(callback) {
new Venue(opts.venue).then(function(venue) {
callback(null, venue);
}).catch(function(err) {
callback(err);
});
},
artists: function(callback) {
new Artist(opts.artist).then(function(artist) {
callback(null, artist);
}).catch(function(err) {
callback(err);
});
},
function(err, res) {
console.log(res); // THIS IS NEVER CALLED.
}
}
答案 0 :(得分:2)
看起来问题是您的回调函数位于您传递给async.parallel
而不是作为其自己的参数的对象内。
你有
async.parallel({
venue: func,
artists: func,
callback
})
而不是
async.parallel({
venue: func,
artists: func,
}, callback
);
但是,真的值得质疑你从混合承诺和异步中获得的收益;它们基本上是为完成同样的任务而设计的;它可能值得挑选一个或另一个。 Promise.all
或Promise.join
之类的内容可替代async.parallel
。
纯粹的承诺版本看起来像:(这是假设蓝鸟承诺;但其他库将是相似的,如果不相同)
Promise.join(new Venue(opts.venue), new Artists(opts.artists))
.then(function(venues, artists) {
//
});
我认为那更清洁了。