异步函数不等待代码完成的问题

问题描述 投票:0回答:1

我正在尝试创建一个脚本,从 API 获取消息,然后过滤掉包含图像的消息。 API 有不同的端点,每个端点都有自己的一批消息。我只是想收集所有这些。在此示例中,有 3 个链接,这就是它三次注销“test”的原因。

我的问题是在调用broadcast()函数之前messageGetter()函数没有完全完成循环。因此,现在当我第一次执行脚本时,它会广播一个空数组,但在第二次执行时,它会包含我需要的内容。

我该如何解决这个问题?

module.exports = {
  async execute(app) {
    await fetchImages(app);
    await interaction.reply("Getting Images");
  },
};

async function fetchImages(app) {
  app.link.forEach(async (link) => {
    if (link.type === 0) {
      await messageGetter(link);
    }
  });
  console.log("here");
  broadcast({ type: "imageLinks", data: imageLinks });
  imageLinks.splice(0, imageLinks.length);
}

async function messageGetter(link, limit = 500) {
  const sum_messages = [];
  let last_id;

  while (true) {
    const options = { limit: 100 };
    if (last_id) {
      options.before = last_id;
    }

    const messages = await link.messages.fetch(options);
    sum_messages.push(...messages.values());
    last_id = messages.last().id;

    if (messages.size != 100 || sum_messages >= limit) {
      break;
    }
  }

  sum_messages.forEach((message) => {
    if (message.attachments.size > 0) {
      message.attachments.forEach((attachment) => {
        if (attachment.url.match(/\.(jpeg|jpg|gif|png)$/i)) {
          imageLinks.push(attachment.url);
        }
      });
    }
  });
console.log("test");
}

日志输出:

here
test
test
test
javascript asynchronous async-await
1个回答
0
投票

你的问题就在这里

app.link.forEach(async (link) => {
   if (link.type === 0) {
     await messageGetter(link);
   }
});

因为 forEach 不会等待 messageGetter() 函数的执行,所以您可以使用 for-of 循环来按您想要的方式工作。示例:

async function fetchImages(app) {
  for(const link of app.link) {
    if (link.type === 0) {
      await messageGetter(link);
    }
  }
  console.log("here");
  broadcast({ type: "imageLinks", data: imageLinks });
  imageLinks.splice(0, imageLinks.length);
}
© www.soinside.com 2019 - 2024. All rights reserved.