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

标签 javascript asynchronous mongoose promise async-await

我正在尝试运行 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/

相关文章:

javascript - <nav> 元素在将 <a> 元素作为子元素时移出父元素

node.js - 如何在 sails 中而不是水线中使用 MongoDB

javascript - Mongoose 动态模式字段

javascript - JSX 没有产生预期的输出,SPAN 嵌套在 A 中

javascript - 基本的 node.js 代码不工作

javascript - 从同步循环内调用异步函数并保持结果有序

python - 如何在 Tornado 中为具有高度可扩展基础架构(可进行大量数据库查询)的应用程序进行 MySQL 数据库调用?

C#有异步函数调用同步函数或者同步函数调用异步函数

javascript - MongoDB:使用过滤器获取附近的所有内容

javascript - Node.js 使用父对象的数据填充子对象(使用 util.inherits 进行继承)