在 for 循环中链接猫鼬承诺

Posted

技术标签:

【中文标题】在 for 循环中链接猫鼬承诺【英文标题】:Chaining mongoose promises in a for loop 【发布时间】: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?

【问题讨论】:

【参考方案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;

以上是关于在 for 循环中链接猫鼬承诺的主要内容,如果未能解决你的问题,请参考以下文章

猫鼬静态方法返回一个蓝鸟承诺

带有多个猫鼬查找的foreach循环后的javascript承诺

如何在Angular 6的循环中链接承诺

蓝鸟承诺:循环猫鼬结果

Selenium WebdriverJS承诺循环

猫鼬批量保存承诺