const mapLoop = async _ => {
console.log('Start')
const promises = books.forEach( async (book) => {
const ownerInfos = await User.find({_id: book.Owner})
return ownerInfos;
})
const ownerInformation = await Promise.all([promises])
console.log(ownerInformation)
console.log('End')
}
mapLoop();
books变量由对象组成,每个对象的键值对为namebook、editionbook、_id和owner(这是一个id)。我想在这里做的是通过存储在值“owner”中的id找到书的所有者。但是,ownerinformation变量未定义。
2条答案
按热度按时间8nuwlpux1#
forEach
不返回任何内容(它在适当的位置对数组进行了变异),因此promises
将始终是未定义的。使用map
而是返回一个新数组。没有必要这样做
map
回调是异步的,并且不需要await
这个find
过程只需回报承诺。promises
现在将是一个数组,因此不需要在Promise.all
.twh00eeo2#
forEach()
用于对每个数组元素执行操作,不会返回新数组。它也不尊重async/await
. 所以,在任何数据库调用实际完成之前就到达了下一行,这并不重要。用你的promises
未定义的:await Promise.all([undefined])
返回[undefined]
尝试将books数组直接Map到promises数组。现在,承诺是一系列的承诺promises
你可以用Promise.all
具有await
为了得到你的结果。但是,您可以进行一个优化,只需进行一个数据库查询,其中包含您所有的
_id
S这将使用$in()运算符,用于搜索给定数组中的字段值:另外,请检查您的
.bookOwner
是mongoose对象id所期望的正确格式。如果没有,您可能需要使用以下内容mongoose.Types.ObjectId(book.Owner)
在上述两种情况下。