【问题标题】:How can I use mongoose functions inside a for loop?如何在 for 循环中使用猫鼬函数?
【发布时间】:2017-06-15 22:41:44
【问题描述】:

有没有办法像这个例子一样在 forEach 循环中使用 mongoose 函数?利用柜台到达可达线

   idsArray.forEach((itemId,i) =>{

        Place.findById(itemId,(err,item)=>{
            if(err){
                console.log("error")
            }
            idsArray[i] = {item.id}; // unreachable
        })
    })

我读过 Async,但我不知道如何通过它实现它

【问题讨论】:

  • 您应该在if (error) 语句中返回,这可能是您无法访问 item.id 的原因之一。也许查询失败,但由于您没有返回,即使出现错误并且项目未定义或为空,它也会继续运行

标签: javascript node.js mongoose


【解决方案1】:

更简单:使用 db promise 映射元素,然后等待所有元素:

var promises= idsArray.map((itemId,i) =>{
  return new Promise(function(resolve,reject){
    Place.findById(itemId,(err,item)=>{
        if(err){
           return reject(new Error("some"));
        }
        resolve(item);
    })
 });
});

Promises.all(promises).then(function(arr){
  console.log(arr);//all results
},function(err){
 throw err;
});

【讨论】:

    【解决方案2】:

    我认为Jonas w 有正确的答案,但我想展示一些细微的变化,并且评论区不是很有用。

    var mongoose = require('mongoose');
    mongoose.Promise = require('bluebird');  // I like bluebird
    
    // Using exec you get fully-fledged promises from the get-go.
    var promises = idsArray.map( itemId => {
      return Place.findById(itemId).exec();
    });
    
    Promise.all(promises)
      .then( arr => { console.log(arr); } )
      .catch( err => { throw err; } );
    

    【讨论】:

    • 这实际上是更好的方法。我不使用猫鼬,所以我不知道 .exec() ... +1
    猜你喜欢
    • 2019-11-10
    • 1970-01-01
    • 2016-11-01
    • 1970-01-01
    • 1970-01-01
    • 2018-08-17
    • 1970-01-01
    • 2020-12-26
    • 2020-09-11
    相关资源
    最近更新 更多