2017-06-15 28 views
1

有没有一种方法可以在forEach循环中使用猫鼬函数,就像这个例子一样?利用计数器和到达可达线如何在for循环中使用猫鼬函数?

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

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

我读到异步但我不知道的方式,通过它

+0

您应该在'if(error)'语句内返回,这可能是您无法访问item.id的原因之一。也许查询失败,但因为你没有返回,所以即使它存在错误并且项目未定义或为null – nicowernli

回答

1

更简单的实现它:地图DB承诺的元素,然后等待对于所有的人:

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; 
}); 
1

我认为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; }); 
+0

这实际上是更好的方法。我不使用猫鼬,所以我不知道.exec()... +1 –