当前位置: 首页 > 知识库问答 >
问题:

等待Promise.reject还是抛出错误来保释?

微生耘豪
2023-03-14

我正在重构我的promise,将代码链接到异步/等待样式。这样做的原因之一是我想要一个catch块来处理所有的错误情况(这里解释了如何理解node.js中的promise拒绝)

我的问题是,当我遇到同步错误时,我是否应该调用等待promise。拒绝抛出错误以退出该过程?我知道这两种方法都可以,但我更喜欢抛出错误。我已经知道我得到了一个无效的结果为什么我要等待?使用throw立即终止控制流似乎是一个更好的选择。

我不是在谈论promise链(我问题的全部),所以我不认为JavaScriptpromise-拒绝vs.扔这个线程回答了我的问题。

我在Node.js中读到了错误处理这篇文章,我认为它也没有给出答案。但它确实说

给定函数应该同步(通过抛出)或异步(通过回调或事件发射器)传递操作错误,但不能同时传递这两种错误。。。一般来说,使用throw并期望调用方使用try/catch是非常罕见的。。。

我的异步函数可能会返回Promise.reject.所以我担心引入两种方法来传递错误。

try {
   let result = await aysncFunc().
   if (!isResultValid(result)) { //isResultValid() is sync function 
      await Promise.reject('invalid result')
      //or throw 'invalid result'
   }
   ... //further processing
}
catch (error) {
  ...
}

共有1个答案

盖向荣
2023-03-14

在promise控制流中使用在语义上是正确的,这通常是脱离promise链的优选方式。

根据编码风格,wait Promise.reject(...)可用于区分实际错误和预期拒绝。带有字符串原因的拒绝promise是有效的,但是抛出无效结果被认为是风格问题,可以用linter规则来解决,因为它通常使用错误实例作为异常。

它之所以重要,是因为无法使用instanceof Error检测字符串异常,并且没有message属性,将一致的错误记录为控制台。warn(Error.message)将导致模糊的定义条目。

// ok
class Success extends Error {}
try {
  throw new Success('just a friendly notification');
} catch (err) {
  if (!(err instanceof Success)) {
    console.warn(err.message);
    throw err;
  }
}

// more or less
const SUCCESS = 'just a friendly notification';
try {
  await Promise.reject(SUCCESS);
} catch (err) {
  if (err !== SUCCESS)) {
    console.warn(err.message);
    throw err;
  }
}

// not ok
try {
  throw 'exception';
} catch (err) {
  if (typeof err === 'string') {
    console.warn(err);
  } else {
    console.warn(err.message);
  }

  throw err;
}

由于无效结果实际上是一个错误,因此合理的做法是:

  throw new TypeError('invalid result');

我不是在谈论promise链(我问题的全部),所以我不认为JavaScriptpromise-拒绝vs.扔这个线程回答了我的问题。

async函数是promise链的语法糖,因此适用于promise的所有点也适用于async

在某些情况下,抛出错误与拒绝promise不同,但它们特定于其他promise实现,如AngularJS$q,并且不影响ES6promise。Promise构造函数中的同步错误导致异常,这也不适用于async

 类似资料:
  • 我正在努力找出以下语法的问题: 我一直得到错误说: 等待是一个保留字 ...但是在异步函数中不合法吗? 调度位来自report-thunk库。

  • 问题内容: 我正在努力用以下语法找出问题所在: 我不断收到错误消息: 等待是保留字 …但是在异步函数中不合法吗? 调度位来自 react-thunk 库。 问题答案: 为了使用,直接封装它的函数需要异步。根据您的评论,添加到内部函数可以解决您的问题,因此我将其发布在这里: 可能的话,您可以从外部函数中删除,因为它不包含任何异步操作,但这取决于该调用者是否期望返回承诺。

  • 在我的Rails 4应用程序中,我有一个对Postgres 9.4数据库的查询: 很受这个相关回答的启发dba.SE. 我只想让我的查询找到并更新第一行(随机地,用< code>LIMIT),其中< code>available = true并将其更新为< code>available = false,我需要在执行此操作的同时锁定该行,但不需要发出新的请求来等待前一个锁的释放,因为有许多并发调用将

  • 我在服务层的spring-boot应用程序中使用了Hystrix(Camden.sr7版本),而没有回退方法。Service的方法之一如下所示: 对于这样的响应,不清楚实际上是从哪个方法抛出异常的。如果我将版本更改为brixton.sr5(以前的版本),它将返回清晰的响应: 因此Hystrix的新版本(实际上是spring-cloud-dependencies的新版本)不会抛出HystrixRun

  • 既然我们可以在Javascript中使用关键字抛出任何东西,那么我们就不能直接抛出一个错误消息字符串吗? 有人知道这里面有什么陷阱吗? 让我对此添加一些背景:在JavaScript世界中,人们通常依赖参数检查而不是使用try-catch机制,因此只使用抛出致命错误是有意义的。不过,为了能够捕捉一些系统错误,我必须为我自己的错误使用一个不同的类,而不是创建错误的子类,我认为我应该只使用String。

  • 我有一种使用猫鼬将产品发布到mongodb的方法。我使用的是异步等待而不是当时的捕获块。我的代码 : 捕获中的错误由我的应用中的快速中间件捕获.js。 这工作正常。在这种特定情况下,当数组“标签”长于5时,我来自Postman(REST API开发工具)的请求返回: 当我尝试在尝试捕获之外使用“如果”检查时,我得到这个错误: 这种在try-catch中抛出错误以检查长度、使用if语句检查空数组的方