Javascript - 错误处理停止代码

Javascript - error handling stopping code

快速基本问题,

当用discord.js v13设置guildmember.timout时,它给出了一个用.then(console.log).catch(console.error)的例子。使用示例,代码将在 .catch.

之后继续
      muteMember
        .timeout(time, reason)
        .catch((error) => {
          return errors(client, message, args, "mute", error, true);
        });

      muteMember.send ... 

目前它将 运行 errors 函数然后继续到 .catch 之后的代码,例如 muteMember.send。在它 运行 之后 "停止" .catch 中的内容的最佳方式是什么?提前谢谢你

您可以将 async-await 与 try-catch 结合使用:

async function myFunction()
{
  try
  {
    await muteMember.timeout(time, reason)
    // throws an error if it fails -- jumps to the catch block

    muteMember.send...
  }
  catch(error)
  {
    errorcheck = true
    errors(client, message, args, "mute", error, true);
    // and whatever other error handling you would like
  }
}

return 语句仅 returns 出 #catch 回调。使用 #then 回调处理承诺,这就是您希望代码在成功时 运行 的位置。

muteMember
    .timeout(time, reason)
    .catch((error) => {
        //error
        errorcheck = true
        return errors(client, message, args, "mute", error, true);
    })
    .then(() => {
        //success
    })

muteMember.timeout() returns a Promise,因此在 promise 解析后你想要 运行 的任何代码都应该包含在 then() 块中:

muteMember
        .timeout(time, reason)
        .then((member) => {
          // code that depends on successfully timing out a member
          muteMember.send....
        })
        .catch((error) => {
          // only runs if there's an error
          errorcheck = true
          return errors(client, message, args, "mute", error, true);
        });

您还可以使用更现代和更易读的 async/await 语法:

const myAsyncFunction = async () => {
  try {
    const member = await muteMember.timeout(time, reason);
    // code that depends on successfully timing out a member
    muteMember.send....
  } catch (error) {  
    // only runs if there's an error
    errorcheck = true
    return errors(client, message, args, "mute", error, true);
  }
}
    

如果出现错误,你可以return设置为falsy,然后检查它是否是falsy,如果是return。

let isModified = await muteMember
        .timeout(time, reason)
        .catch((error) => {
            errors(client, message, args, "mute", error, true)
            return false;
        })
if (!isModified) return;