如果forEach,请使用Promise.all而不是async / await

时间:2018-06-22 09:46:04

标签: node.js promise async-await discord.js

我正在使用LoginScreen做一个不和谐的机器人,该机器人从API获取数据并添加或删除与该数据关联的消息。

在下面的代码段中,如果API不再提供相应的数据,我已编写了删除消息的逻辑。

discord.js是一个映射,其中包含gameEmbeds作为来自API的数据的标识符和key作为不和谐通道中消息的标识符。

val

我必须使用迭代器功能 gameEmbeds.forEach(async (val, key, map) => { if (map !== undefined && newGames.get(key) === undefined) { const message = await channel.fetchMessage(val); message.delete() .catch((e) => { console.error(`${new Date()} `, e); }); } ,因为要逐个处理每个条目以使UI中的更改看起来更加平滑,这违反了JS的异步特性。

我想我可以确保使用async可以做到这一点,这也可以使此代码更快一些,但是,我不知道如何在我的代码中实现它而不破坏内容。我是node.js的新手。请帮忙。

编辑:谢谢CF256,我删除了多余的Promise.all

1 个答案:

答案 0 :(得分:1)

我将创建一个用于容纳所有小承诺的新数组,一旦完成forEach循环,我将在小承诺守望者上调用Promise.all

const allDeleteJobs = [];
gameEmbeds.forEach(async (val, key, map) => {
  if (map !== undefined && newGames.get(key) === undefined) {
    const message = await channel.fetchMessage(val);
    // Push the new delete job to the array registry
    allDeleteJobs.push(message.delete());
  }
});
(async () => {
  if(allDeleteJobs.length >= 1){
    await Promise.all(allDeleteJobs);
    // Delete all the messages or do other stuff
  }
})()
.catch(error => console.error(error));