mongoose exec用async.parallel调用

时间:2015-02-18 12:40:42

标签: node.js asynchronous parallel-processing mongoose

我的快速控制器中有这样的代码

   function (req, res) {
      var queries = [];

      data.forEach(function (item) {
        var query = myModel.findOneAndUpdate({remoteId: item.id}, item, {upsert: true}).exec;

        queries.push(query);
      });

      async.parallel(queries, function (err, docs) {
        res.json(docs);
      });
    });

如果数据数组有3项,那么我有一个3个空值的数组。

async.parallel函数接受带有回调参数的函数,应调用该函数以正确完成其执行。所以mongoose.Query.exec does一样。但是我收到了一个空对象数组。

如果我将exec这样的电话包裹起来

var query = function (cb) {
  tournamentsModel.findOneAndUpdate({remoteId: item.id}, item, {upsert: true}).exec(function (err, model) {
    cb(err, model);
  });
};
queries.push(query);

一切都很好,我收到了来自mongo的3个文档。 当async.parallel方法执行相同操作时,为什么我应该显式调用传递给exec函数调用的回调?

1 个答案:

答案 0 :(得分:0)

当您直接将查询的exec函数作为执行函数传递给async.parallel时,您将丢失包含查询的该函数调用的this上下文跑。

要使用此方法,您需要致电bind以返回一个新功能,该功能将使用正确的exec上下文调用this;所以像这样:

var query = Query.prototype.exec.bind(
    myModel.findOneAndUpdate({remoteId: item.id}, item, {upsert: true})
);
queries.push(query);

自己致电exec可能更干净,但是可以通过async回调传递给它:

var query = function(cb) {
    myModel.findOneAndUpdate({remoteId: item.id}, item, {upsert: true}).exec(cb);
}
queries.push(query);