如何在继续执行代码之前捕获错误?

时间:2019-10-26 14:55:26

标签: javascript node.js discord.js

我有一个命令,向公会中的每个用户发送一条消息。当然,用户可能会关闭DM。我想使用.catch来统计这些用户(并向该频道发送一条消息,其中包含禁用该用户的数量)。

我的问题是,.catch块在命令的其余部分(将消息发送到通道的部分)之后之后执行自身 在.catch块中,每次它给我错误时,我都会在变量中添加 1 。 在频道消息中,我发送变量。显然,该变量将为 0 ,因为它在运行.catch块之前发送了消息。

.catch块之后之后,如何发送关闭了消息的用户数?

这是我的代码:

var text = args.join(' ')
message.guild.members.forEach(member => {
     member.send(text).catch(() => {
          console.log("Can't send DM to this user!")
          faultyusers++
     });
});
console.log(faultyusers);
message.channel.send("Successfully sent message to all members in the server. (Warning: **" + faultyusers + "** users might have not received the message because of their settings.)")

(运行该命令时, faultyusers 始终为 0 。)

1 个答案:

答案 0 :(得分:3)

每个member.send()是异步的。因此,为此您需要为每个member.send()调用创建一个Promise。之后,您将运行所有的承诺,当它们全部解决后,您将获得一系列结果,从中可以计算未收到消息的用户数量

// this function returns promise that will
// resolve with { success: true } or { success: false }
// depending on whether or not the user received the message (member.send() failed)
const sendMessageAndGetResult = (text, member) =>
    member
      .send(text)
      .then(() => ({ success: true }))
      .catch(() => ({ success: false }))

const sendMessages = async (text) => {
  // create one such promise for each user in guild
  const promises = message.guild.members.map(member => sendMessageAndGetResult(text, member))
  // wait until all promises are resolved
  // allResults will be an looking like this [{ success: true }, { success: false }, ...]
  const allResults = await Promise.all(promises)
  // count users that did not receive message
  const faultyUsersCount = allResults.filter(result => !result.success).length
  console.log(faultyUsersCount)
  message.channel.send("Successfully sent message to all members in the server. (Warning: **" + faultyUsersCount + "** users might have not received the message because of their settings.)")
}

// usage
sendMessages('hello')