我正在使用异步模块来帮助创建依赖于其他异步创建对象的对象。异步创建的对象具有针对它们运行的验证,这些验证最终返回了诺言。我遇到的问题是,“最终”异步回调似乎从未被调用过,而且我也不知道为什么。
示例代码:
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.
}
}
最佳答案
看来问题在于您的回调函数位于您要传递给async.parallel
的对象内部,而不是作为其自己的参数。
你有
async.parallel({
venue: func,
artists: func,
callback
})
代替
async.parallel({
venue: func,
artists: func,
}, callback
);
但是,真正值得质疑的是,您从这样的混合承诺和异步中获得了什么?它们本质上旨在完成相同的任务;可能值得选择其中一个。
Promise.all
或Promise.join
之类的东西可以替代async.parallel
。它的纯promise版本将如下所示:(这是假设bluebird的promise;但是其他库将是相似的,如果不相同的话)
Promise.join(new Venue(opts.venue), new Artists(opts.artists))
.then(function(venues, artists) {
//
});
我认为这要干净得多。
关于node.js - Node 结合使用 promise 和异步模块,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/25210497/