Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/35.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 承诺/异步等待mongoose,返回空数组_Javascript_Node.js_Mongoose_Promise_Async Await - Fatal编程技术网

Javascript 承诺/异步等待mongoose,返回空数组

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

最后的控制台返回空数组。 控制台在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)

我做错了什么?

没有等待
.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。。。。但是,地图是正确的方法,如果它被正确地使用。它起作用了,我为你学会了一个新概念。非常感谢!:)