node js синхронно для цикла - PullRequest
1 голос
/ 07 апреля 2020
  db.collection("influencer_chat_db").find({}).toArray(function(err, chatResult){

  for(i=0;i< chatResult.length;++i){
    console.log("A");
    await db.collection("chatNewmsgNotification").find({"room":chatResult[i].room}).toArray(await function(err,notificationResult){
      console.log("B")
    });
  }})

Я хочу получить данные из коллекции "chatNewmsgNotification", используя для l oop, однако при выполнении происходит синхронный формат. Я сделал код простым для понимания способом, ожидаемое выполнение и вывод - ABA B. В настоящее время я получаю AAB B.

1 Ответ

0 голосов
/ 07 апреля 2020

Это происходит из-за того, что функция callback не привязана к promise, поэтому, как только promise возвращает, все еще остается неизвестное (небольшое) количество времени до вызова функции callback, поэтому oop удается быть быстрее.

У вас есть два простых исправления:

  1. Изменить поиск на работу без обратного вызова:
db.collection("influencer_chat_db").find({}).toArray(async function (err, chatResult) {

    for (i = 0; i < chatResult.length; ++i) {
        console.log("A");
        await db.collection("chatNewmsgNotification").find({"room": chatResult[i].room}).toArray();
        console.log("B")
    }
});
Если по какой-то причине вам нравится функциональность callback, оберните ее promise:
db.collection("influencer_chat_db").find({}).toArray(async function (err, chatResult) {

    for (i = 0; i < chatResult.length; ++i) {
        console.log("A");

        await new Promise((resolve, reject) => {
            try {
                db.collection("chatNewmsgNotification").find({"room":chatResult[i].room}).toArray(await function(err,notificationResult){
                    console.log("B");
                    resolve();
                });
            } catch (e) {
              reject(e)  
            } 
        })
    }
})
...