gpt4 book ai didi

javascript - 如何在 for 循环内运行 mongoose 方法,因为 mongoose 函数是异步的

转载 作者:行者123 更新时间:2023-11-28 03:27:51 24 4
gpt4 key购买 nike

我正在尝试运行 Mongoose 查找命令,如果它与数组中的几个数据集匹配,则需要更新数据库。这是我写的查询。

membersId=["U-ZCIwZGvW", "U-MbyAVxXf", "U-Gbe9RhGu"];

let updateUserData=(groupData)=>{
return new Promise((resolve,reject)=>{
for(M in membersId){
console.log(membersId[M]);
UserModel.findOne({userId:membersId[M]},(err,response)=>{
if(err){
console.log(err);
reject(err);
}else if(check.isEmpty(response)){
reject("Id not found");
}else{
if(!response.groups.includes(groupData._id)){
response.groups.push(groupData._id)
response.save((err,data)=>{
if(err){
console.log(err);
reject(err);
}else{
console.log(data);
}
})
}
}
})
}
resolve(groupData,'Members Added','AddMembersToGroup',00);
})
}

我读到了有关 async-await 的内容并尝试了这个..

membersId=["U-ZCIwZGvW", "U-MbyAVxXf", "U-Gbe9RhGu"];

let updateUserData = (groupData) => {
return new Promise((resolve, reject) => {

async function getTodos() {
for (const M of membersId) {
await UserModel.findOne({ userId: M }, (err, response) => {
if (err) {
console.log(err);
reject(err);
} else if (check.isEmpty(response)) {
reject("Id not found");
} else {
if (!response.groups.includes(groupData._id)) {
response.groups.push(groupData._id)
response.save((err, data) => {
if (err) {
console.log(err);
reject(err);
} else {
console.log(data);
}
})
}
}
})
}

console.log('Finished!');
resolve(groupData,'Members Added','AddMembersToGroup',00);
}

getTodos();
})
}

异步方法正在工作,但仍然不是完全同步,而且如果发生任何错误,它也不会停止。

如何在出错时退出 for 循环并仅执行一次解析语句,以便运行后不会返回到其他代码。

即使有错误它也会运行。

最佳答案

有几件事:

  • 您无需执行多个 find 请求来查找和更新多条记录,只需使用 updateMany 以及正确的过滤器和更新参数即可
  • 异步函数返回的 Promise 与您的函数的情况不同 getTodos
  • 您需要像这样调用异步函数:await getTodos();
  • 如果你的 Promise 拒绝了你需要在 try/catch 中处理的事情(抛出错误)

您可以在异步函数中使用以下内容:

try {
var response = await getTodos(groupData, membersId);
console.log(response);
}
catch(err){
console.log(err);
}

使用getTodos函数:

async function getTodos(groupData,membersId) {
return new Promise(function(resolve, reject){
UserModel.updateMany({
userId: { "$in" : membersId},
groups: { "$ne": groupData._id }
},{
$push: { groups: groupData._id }
}, function(err,response){
if (err) {
reject(err);
} else if (response.nModified === 0){
reject("Id not found");
} else {
resolve(response.nModified + " items modified");
}
});
});
}

关于javascript - 如何在 for 循环内运行 mongoose 方法,因为 mongoose 函数是异步的,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58465478/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com