Promise/async-await with mongoose,返回空数组

ANK*_*DAR 3 javascript mongoose node.js 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 })
    lync.map(u => {
        allLync.push[u]
    })
})

console.log(allLync)
Run Code Online (Sandbox Code Playgroud)

我究竟做错了什么?

Ben*_*aum 5

.map代码不等待,所以console.log映射发生之前发生.

如果你要等待地图-你可以用Promise.allawait:

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)
Run Code Online (Sandbox Code Playgroud)

请注意,因为您使用.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); 
Run Code Online (Sandbox Code Playgroud)