Mongoose:通过数组查询,返回数组的promise

时间:2015-06-29 16:31:40

标签: node.js mongodb mongoose

我试图遍历opts并对每个元素进行相同的查询,我想要一个包含查询结果的数组的承诺。我怎样才能做到这一点 ?

我只尝试了第一项

//opts is an array of objects
function getRecapOfCampaign (campaignId, opts) {    
  var p_votes = Models.BSVote
    .find({
      created: {
        $gte: opts[0].fromDate,
        $lt: opts[0].toDate
      }
    })
    .where('campaign').equals(campaignId)
    .count()
    .exec();

  return p_votes;
}

1 个答案:

答案 0 :(得分:2)

有很多可以用于此的promise lib,或者你可以在较新版本的Node上使用本机JS Promise实现。特别是Promise.all方法。

Promise.all([ARRAY_OR_PROMISES]).then(values => {
  console.log(values); // [ARRAY_OF_RESULTS_FROM_PROMISES]
});

使用Promise.allmap可以准确地提供您想要的内容:

//opts is an array of objects
function getRecapOfCampaign(campaignId, opts) {
  return Promise.all(opts.map(function(opt) {
    return Models.BSVote.find({
        created: {
          $gte: opt.fromDate,
          $lt: opt.toDate
        }
      })
      .where('campaign').equals(campaignId)
      .count()
      .exec();
  }));
}

注意:对于Promise.all,同时运行的promises数量没有限制。如果这是一个问题,您可以自己滚动或使用具有此方法的许多承诺库中的一个。