【问题标题】:Unable to push fetched data to global array insise a function无法将获取的数据推送到函数内的全局数组
【发布时间】:2019-03-31 22:10:02
【问题描述】:

我在操作全局数组时遇到问题。

如果这样写,代码运行良好

  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);

And the output is like this when it works

但是,一旦我添加了一行代码(用于从数据库中获取数据),全局数组就不会改变。

在** **之间是添加的代码行(let 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);

输出显示如下: I don't know why the order of the logs changing

请帮助我了解发生了什么。 我想将获取的数据推入全局数组(chatBoxes),但在函数之外,数组仍然是空的(如果我在函数中添加一个简单的字符串,则不是空的)。

我怀疑 forEach 之后的代码在结束循环之前运行。也许这就是问题所在?

谢谢!

【问题讨论】:

  • 如果可以,请将您的实际代码作为文本编辑到您的问题中 - 代码单独的图像是tedious and difficult,可以使用和调试.它会迫使那些本来愿意帮助你的人先transcribe your image,这是浪费时间。

标签: javascript node.js mongodb scope global-variables


【解决方案1】:

您的变量 chatBox 使用 let 声明声明,然后 chekBox 将在其范围内可用(user.message.forEach() 内的匿名函数。

var 语句更改let,如果checkBox 是一个全局变量,最好在forEach() 范围之外声明它,可能在function getChatBox() 的顶部

【讨论】:

  • 谢谢,但它没有用。我将其更改为 var。聊天框已经在 forEach 之外。当获取以某种方式发生时,全局变量仅在 forEach 内部发生变化,然后在其外部发生变化,数组的值与初始值相同。它还更改了日志顺序,它跳过了 forEach 中的代码,然后运行它。
  • 这是因为您在 forEach() 中使用“let checkBox”重新声明了 checkBox,这是一个指针问题(对于使用 javascript 的程序员来说是不可见的)。我认为如果你切断 forEach() 中的“let”语句会起作用
  • 我更改了它,但它不起作用:( chatBox 变量是我要推送到 chatBoxes 数组的单个项目。
  • 能否分享originMessage所代表的数据,以便清楚地证明你的代码?否则我帮不了你。
  • 当然,originMessage是mongoDB中消息文档的id(例如:ObjectId("5bd33cce32b3e62d1450aa12"))。原始消息是发送的第一条消息。对原始消息的每条响应消息在其文档中都有它的 originMessage ID。
【解决方案2】:

我修好了。我还不确定如何。我使用常规 for 循环而不是 forEach。在 forEach 中使用 async/await 效果不佳。我正在学习它。阅读此处了解更多信息:https://codeburst.io/javascript-async-await-with-foreach-b6ba62bbf404

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-03-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-07-07
    • 2019-07-20
    • 1970-01-01
    相关资源
    最近更新 更多