首页 > 解决方案 > 如何在继续代码之前捕获错误?

问题描述

我有一个命令向公会中的每个用户发送消息。当然,用户也有可能关闭了 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。

标签: javascriptnode.jsdiscord.js

解决方案


每个member.send()都是异步的。因此,为此您需要为每个调用创建一个Promise 。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')

推荐阅读