как запустить метод mongoose внутри цикла for, поскольку функция mongoose асинхронна - PullRequest
1 голос
/ 19 октября 2019

Я пытаюсь запустить команду поиска 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 при ошибке и выполнить оператор resol только один раз, чтобы он не возвращался к другому коду после запуска.

, даже если есть ошибка, она запускается.

1 Ответ

0 голосов
/ 19 октября 2019

Есть несколько вещей:

  • вам не нужно выполнять несколько find запросов для поиска и обновления нескольких записей, просто используйте updateMany с правильным фильтром и параметрами обновления
  • асинхронная функция возвращает Promise, что не относится к вашей функции getTodos
  • вам необходимо вызвать асинхронную функцию следующим образом: await getTodos();
  • в случае, если вашаОбещание отклоняет что-то, что вам нужно для обработки в 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");
            }
        });
    });
}
...