Javascript 在我的db.collection forEach上使用Promise.all
如何使用promise.all此功能:Javascript 在我的db.collection forEach上使用Promise.all,javascript,node.js,es6-promise,node-mongodb-native,Javascript,Node.js,Es6 Promise,Node Mongodb Native,如何使用promise.all此功能: function getUsersGroups(users, req) { users.forEach(function(user) { user.groups = []; db.collection("groups") .find({ "users._id": String(user._id) }) .toArray(function(err, docs) { user.groups =
function getUsersGroups(users, req) {
users.forEach(function(user) {
user.groups = [];
db.collection("groups")
.find({ "users._id": String(user._id) })
.toArray(function(err, docs) {
user.groups = docs;
});
});
return users;
}
getUsersGroups(docs, req)
.then(users => {
res.send(users);
})
.catch(error => {
// if you have an error
});
我不知道该怎么办,谢谢你
PS:用户数组没有通过文档实现(他们控制台日志正常)
这是我的第二次尝试:
function getUsersGroups(users, req) {
users.forEach(
(user, index, array) => (
array[index].user =[]
array[index].user.groups = myApiCall(user))
);
function myApiCall(user) {
db.collection("groups")
.find({ "users._id": String(user._id) })
.toArray(function(err, docs) {
console.log(docs);
return docs;
});
}
return users;
}
array[index].user.groups = myApiCall(user))
^^^^^
SyntaxError: Unexpected identifier
编辑:
最后,我使用这个函数,正如Ashish所说(它获取用户所在的所有组,并更新用户模型):
我在另一个node.js函数中这样调用:
function getUsersGroups(users, req) {
users.forEach(function(user) {
user.groups = [];
db.collection("groups")
.find({ "users._id": String(user._id) })
.toArray(function(err, docs) {
user.groups = docs;
});
});
return users;
}
getUsersGroups(docs, req)
.then(users => {
res.send(users);
})
.catch(error => {
// if you have an error
});
多谢各位
async function getUsersGroups(users, req) {
await Promise.all(users.map(user => {
return db.collection("groups")
.find({ "users._id": String(user._id) })
.toArray()
.then(group => {
user.groups = group;
})
}));
return users;
}
希望这有助于查看
toArray
的文档,如果未指定回调,它将返回一个Promise
。然后,我们可以使用.map
而不是.forEach
生成承诺数组,然后将其传递给承诺。所有:
function getUsersGroups(users, req) {
const promises = users.map(function(user) {
user.groups = []
return db
.collection("groups")
.find({ "users._id": String(user._id) })
.toArray()
.then(groups => {
user.groups = groups
})
});
return Promise.all(promises);
}
请注意,这会改变用户对象。也就是说,您传递给函数的任何用户
都将通过设置组
字段进行修改。这是否与节点mongodb native
相关?是的,存在多个api调用。这是否回答了您的问题?您好,如何返回用户?我这样调用函数:docs=getUsersGroups(docs,req)@HarmoniusTool我已经编辑了我的答案。基本上是等待promise all完成,然后返回用户。我如何调用此函数?等待promise.all(users.map)(user=>{^^^^^^ SyntaxError:await仅在异步函数中有效,只需对函数getUsersGroups执行assasync
。我已经添加了它。非常感谢,您的函数正在工作,但当我从另一个函数调用它时,getUsersGroups(docs,req);为空,而console.log(groups)说它在getUsersGroups()内部时被填充。如何调用此函数?我尝试这样调用它:getUsersGroups(docs,req)。然后(result=>{console.log(result);res.send(result);})。catch(error=>{//如果有错误});非常感谢您的出色回答,我终于使用了Ashish答案,并调用了像getUsersGroups(docs,req)这样的函数。然后(result=>{console.log(result);res.send(result);})。catch(error=>{//if you have error});但我猜您的答案也在起作用。