在我的 db.collection forEach 上使用 Promise.all
Using Promise.all on my db.collection forEach
如何将 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 = docs;
});
});
return users;
}
不知道怎么办,谢谢。
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 说的那样(它获取用户所在的所有组,并更新用户模型):
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;
}
我在另一个 node.js 函数中这样调用 :
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
的文档,如果未指定回调,它 returns 一个 Promise
。然后我们可以使用 .map
而不是 .forEach
来生成一个承诺数组,然后我们可以将其传递给 Promise.all
:
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);
}
请注意,这会改变用户对象。也就是说,无论您传递给函数的 users
将被设置的 groups
字段修改。
如何将 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 = docs;
});
});
return users;
}
不知道怎么办,谢谢。
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 说的那样(它获取用户所在的所有组,并更新用户模型):
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;
}
我在另一个 node.js 函数中这样调用 :
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
的文档,如果未指定回调,它 returns 一个 Promise
。然后我们可以使用 .map
而不是 .forEach
来生成一个承诺数组,然后我们可以将其传递给 Promise.all
:
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);
}
请注意,这会改变用户对象。也就是说,无论您传递给函数的 users
将被设置的 groups
字段修改。