将节点与异步模块结合使用的节点

时间:2014-08-08 19:00:01

标签: node.js asynchronous promise

我正在使用异步模块来帮助创建依赖于异步创建的其他对象的对象。异步创建的对象具有针对它们运行的​​验证,最终返回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.
    }
}

1 个答案:

答案 0 :(得分:2)

看起来问题是您的回调函数位于您传递给async.parallel而不是作为其自己的参数的对象内。

你有

 async.parallel({
      venue: func,
      artists: func,
      callback
 })

而不是

async.parallel({
      venue: func,
      artists: func,
      }, callback
);

但是,真的值得质疑你从混合承诺和异步中获得的收益;它们基本上是为完成同样的任务而设计的;它可能值得挑选一个或另一个。 Promise.allPromise.join之类的内容可替代async.parallel

纯粹的承诺版本看起来像:(这是假设蓝鸟承诺;但其他库将是相似的,如果不相同)

Promise.join(new Venue(opts.venue), new Artists(opts.artists))
.then(function(venues, artists) {
    //
});

我认为那更清洁了。