Discord.js,如何处理向禁用隐私设置的用户发送私人消息的错误以及错误后立即 return?

Discord.js, how to handle error sending private message to user with disabled privacy setting and return right after error?

是否有可能的方法来处理在触发错误后 return 立即返回的错误?

  if(command === 'test') {
    message.author.send('Dm Test').catch(error => {
      message.reply('I failed to send you a private message!')
      return;
    })
    //some code below, should not trigger after sending message error. 

问题是 .catch 会像最后一样响应,如何处理这个错误并立即 return 而不是 运行 也有下面的代码?我尝试使用 try { 但没有用。

message.author.send('') 
   .catch(() => message.reply("Can't send DM to your user!"));

想知道是否有其他方法来处理错误。任何帮助将不胜感激。

如果您在发送错误消息之前放置 return,JavaScript 将在您返回消息时读取它,因此如果您执行以下操作:

message.author.send('') 
   .catch(() => return message.reply("Can't send DM to your user!"));

你会得到错误消息作为最后的命令 运行 之后不会有其他的。

您可以在 if & else 语句中使用 try 来了解您是否可以私信此人。

if(command === 'test') {
   try {
     message.author.send("Something right here")
   } catch {
     message.channel.send("I can't dm this person.")
   } else {
    //something exploration code here
   }
}

.catch() 在其余代码之后执行的原因是因为 .send() 是异步的并且 return 是 Promise。可以这样想:每次发送消息时,discord.js 都必须向 Discord API 发送 HTTP 请求,等待响应,然后将响应中的数据提供给您。该过程不是瞬时的,需要一些时间,这就是为什么使用 Promise 结构非常有用。

至于具体的问题,您只是想等待您.catch()的回复。这可以通过在 async 中制作你是 运行 这个代码的函数来完成。这是一个例子:

client.on("messageCreate", async (message) => {

    let response = await message.author.send('').catch(() => {
        message.reply("Can't send DM to your user!"));
        return false;
    });

    // (If error occurred, 'response' will be false)
    if (!response) return; // Return if the error occurred

    // ... Code for if error did not occur
    // (If no error occurred, 'response' will contain sent message)

});

await 关键字将等到您正在执行的异步行已完成(即,直到已获得 return 值或已捕获错误),然后再继续您的代码.请注意 async 关键字的使用。您只能在标记为 async.

的函数中使用 await