【问题标题】:Chaining mongoose promises in a for loop在 for 循环中链接猫鼬承诺
【发布时间】:2016-11-01 21:10:54
【问题描述】:

我有一个 api 使用这个函数在 mongodb 中创建一个新文档:

export function create(req, res) {
  return Track.create(req.body)
    .then(respondWithResult(res, 201))
    .catch(handleError(res));
}

这只是添加了一个新文档,我想扩展它,在添加文档后,我想将更多文档添加到另一个集合中,其中包含来自响应的信息,如下所示:

export function create2(info) {
  var trackId = info._id;
  var users = info.users;

  var basic = {
    trackId : trackId
  };

  for (let user of users) {
    basic.username = user.username;

    Location.create(basic);
  }
}

我想在第一个 create 函数的 promise 的 .then 上调用 create2 函数,如下所示:

export function create(req, res) {
  return Track.create(req.body)
    .then(create2)
    .then(respondWithResult(res, 201))
    .catch(handleError(res));
}

问题是create2没有返回一个promise,我真的不知道如何在create2中链接Location.create返回的promise?

【问题讨论】:

    标签: javascript node.js mongoose promise es6-promise


    【解决方案1】:

    create2 返回一个promise 的方法是使用Promise.all(),它在传递给它的promise 数组全部实现时实现。像这样的...

    var _ = require('underscore');   // optional but useful for a better loop with '.map'
    
    export function create2(info) {
      var trackId = info._id;
      var users = info.users;
    
      var basic = {
        trackId : trackId
      };
    
      var promises = _.map(users, function(user) {
        basic.username = user.username;
        return Location.create(basic);
      });
      return Promise.all(promises);
    }
    

    【讨论】:

    • 我将所有的 Promise 推入一个数组并使用这个包:npmjs.com/package/q 将它们与 Q.all(arrayOfPromises) 合并
    • 我假设原生支持,但 q 很好。我想你可以告诉 Mongoose 你也在使用它,就像 mongoose.Promise = require('q').Promise;
    猜你喜欢
    • 2019-06-04
    • 2018-02-15
    • 2018-09-01
    • 2016-06-04
    • 2017-12-10
    • 1970-01-01
    • 1970-01-01
    • 2015-05-12
    • 1970-01-01
    相关资源
    最近更新 更多