Невозможно отправить извлеченные данные в глобальный массив для проверки функции - PullRequest
0 голосов
/ 27 октября 2018

У меня проблема с манипулированием глобальным массивом.

Код работает хорошо, если он написан так

  function getChatBox(originMessage) {
    return new Promise((resolve, reject) => {
      resolve(
        Message.aggregate([
          {
            $match: { _id: originMessage }
          },
          {
            $unwind: "$subMessages"
          },
          {
            $lookup: {
              from: "messages",
              localField: "subMessages",
              foreignField: "_id",
              as: "chained"
            }
          },
          {
            $unwind: "$chained"
          },
          {
            $project: { chained: 1, _id: 0 }
          }
        ])
      );
    });
  }

  let chatBoxes = [];
  if (user.messages.length > 0) {
    user.messages.forEach(async msg => {
      //let chatBox = await getChatBox(msg.originMessage);
      //chatBoxes.push(chatBox);
      //chatBoxes.push(await getChatBox(msg.originMessage));
      chatBoxes.push("cool");
      console.log(chatBoxes);
    });
  }
  console.log("outer", chatBoxes);

И вывод такой, когда он работает

Однако, как только я добавляю строку кода (для извлечения данных избаза данных) доза глобального массива не изменяется.

между ** ** - строка добавленного кода (пусть chatBox = await getChatBox (msg.originMessage);):

      function getChatBox(originMessage) {
        return new Promise((resolve, reject) => {
          resolve(
            Message.aggregate([
              {
                $match: { _id: originMessage }
              },
              {
                $unwind: "$subMessages"
              },
              {
                $lookup: {
                  from: "messages",
                  localField: "subMessages",
                  foreignField: "_id",
                  as: "chained"
                }
              },
              {
                $unwind: "$chained"
              },
              {
                $project: { chained: 1, _id: 0 }
              }
            ])
          );
        });
      }

      let chatBoxes = [];
      if (user.messages.length > 0) {
       user.messages.forEach(async msg => {
          **let chatBox = await getChatBox(msg.originMessage);**
          //chatBoxes.push(chatBox);
          //chatBoxes.push(await getChatBox(msg.originMessage));
          chatBoxes.push("cool");
          console.log(chatBoxes);
        });
      }
      console.log("outer", chatBoxes);

И вывод показывает это: Я не знаю, почему меняется порядок журналов

Пожалуйста, помогите мне понять, чтопроисходит.Я хочу вставить в глобальный массив (chatBoxes) извлеченные данные, но вне функции массив все еще пуст (не пуст, если я добавляю в функцию простую строку).

Я подозреваю, что код послеforEach запускается до завершения цикла.Может в этом проблема?

Спасибо!

Ответы [ 2 ]

0 голосов
/ 27 октября 2018

Я исправил это.Я не уверен, как еще.Я использую обычный цикл for вместо forEach.appernatly использование async / await внутри forEach не работает хорошо.Я узнаю об этом.Подробнее читайте здесь: https://codeburst.io/javascript-async-await-with-foreach-b6ba62bbf404

0 голосов
/ 27 октября 2018

Ваша переменная chatBox объявляется с помощью оператора let, тогда chekBox будет доступен только в своей области (анонимная функция внутри user.message.forEach().

Измените let с помощью оператора var, и если checkBox является глобальной переменной, было бы лучше объявить ее вне области действия forEach(), возможно, в верхней части function getChatBox()

...