我正在使用异步模块来帮助创建依赖于其他异步创建对象的对象。异步创建的对象具有针对它们运行的​​验证,这些验证最终返回了诺言。我遇到的问题是,“最终”异步回调似乎从未被调用过,而且我也不知道为什么。

示例代码:

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.allPromise.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/

10-16 20:53