Javascript 承诺/异步等待mongoose,返回空数组
最后的控制台返回空数组。 控制台在ids.map函数完成之前运行Javascript 承诺/异步等待mongoose,返回空数组,javascript,node.js,mongoose,promise,async-await,Javascript,Node.js,Mongoose,Promise,Async Await,最后的控制台返回空数组。 控制台在ids.map函数完成之前运行 var ids = []; var allLync = [] var user = await User.findOne(args.user) ids.push(user._id) user.following.map(x => { ids.push(x) }) ids.map(async x => { var lync = await Lync.find({ "author": x }) ly
var ids = [];
var allLync = []
var user = await User.findOne(args.user)
ids.push(user._id)
user.following.map(x => {
ids.push(x)
})
ids.map(async x => {
var lync = await Lync.find({ "author": x })
lync.map(u => {
allLync.push[u]
})
})
console.log(allLync)
我做错了什么?没有等待
.map
代码,因此控制台.log
在映射发生之前发生
如果您想等待地图-您可以使用Promise.all
和wait
:
var ids = [];
var allLync = []
var user = await User.findOne(args.user)
ids.push(user._id)
user.following.map(x => {
ids.push(x)
})
// note the await
await Promise.all(ids.map(async x => {
var lync = await Lync.find({ "author": x })
lync.map(u => {
allLync.push(u); // you had a typo there
})
}));
console.log(allLync)
但是请注意,由于您使用的是.map
,因此可以显著缩短代码:
const user = await User.findOne(args.user)
const ids = users.following.concat(user._id);
const allLync = await Promise.all(ids.map(id => Lync.find({"author": x })));
console.log(allLync);
如果您不介意使用bluebird,那么Promise.map()现在是一个更加简洁的选项。
它可能看起来像:
const user = await User.findOne(args.user);
const ids = users.following.concat(user._id);
const allLync = await Promise.map(ids, (id => Lync.find({"author": x })));
console.log(allLync);
。我真的很喜欢使用它。lync的价值是什么?-尝试添加
console.log(lync)
,查看lync.find({“author”:x})
返回给您的是什么-顺便说一句,这是.map
的一个非常糟糕的用法-您编写的方式,你也可以使用.forEach
@JaromandaX你是对的,但是一个小错误:OP确实需要.map
在这里,因为他们需要承诺在日志
之前等待他们,除了返回的值我的。map
没有被实际使用-我说了他使用的方式。map他也可以使用。forEach。。。。但是,地图是正确的方法,如果它被正确地使用。它起作用了,我为你学会了一个新概念。非常感谢!:)