Node.js - 在 ES6 承诺链中抛出异常

Node.js - throw exception inside ES6 promise chain

作为节点的一部分。js/Express API 我正在开发,我已经构建了一个自定义错误处理程序,可以让我在需要时抛出特定错误,例如BadRequest 或 NotFound 等

当我想在承诺链中抛出时出现问题。例如:

db.doSomethingAsync().then(data => {

    if(data.length === 0){
        throw new errors.ResourceNotFound({ resource: "foo" });
    }
});

在对该主题进行了大量阅读后,我发现此错误将被 Promise 吞没,因此导致未处理的 Promise 拒绝。

我知道我可以拒绝,但我不确定我如何处理特定错误(而不是我不想要的关于拒绝的包罗万象)。

此外,要拒绝,我是否不需要在我的承诺链中创建一个新的承诺?感觉很乱。

任何人都可以建议如何处理在承诺链中抛出特定异常吗?

除了对 then() 的第一个回调是 resolve 回调并接收数据之外,您还可以向其提供第二个回调,即 reject 回调并接收错误.所以你可以在下一个 then 的第二个回调中捕获这个特定错误:

db
  .doSomethingAsync()
  .then(data => {
    if(data.length === 0){
        throw new errors.ResourceNotFound({ resource: "foo" });
    }
  })
  .then(massagedData => {
    // work with massagedData here
  }, err => {
    // handle err here which is previous thrown error
    // assert.ok( err instanceof errors.ResourceNotFound() )
  })
  .catch(err => {
    // this will catch unhandled errors if any
  });

then() 默认情况下 returns 一个承诺,如果它的任何回调(无论是第一个还是第二个)抛出错误,那么它 returns 被拒绝的 promise 及其原因将被下一个拒绝回调(如果有)或最后的 catch 捕获。所以你不需要创建一个新的承诺。

Promise.prototype.then()