Promise构造函数中的错误处理

时间:2015-11-25 09:03:35

标签: javascript promise

Promise构造函数中错误处理的最佳实践是什么?

Promises具有在promise链中传播错误的巨大优势,并且错误无法逃脱,但是当涉及到Promise构造函数时,您必须手动处理可能的错误。

让我举个例子:

new Promise(resolve => {
    throw new Error('error in the constructor');
    resolve();
});

当上面的代码运行时,承诺永远不会得到解决(或拒绝),所以我无法处理promise链中的错误。 现在一个明显的解决方案是:

new Promise((resolve, reject) => {
    try {
        throw new Error('error in the constructor');
        resolve();
    } catch(error) {
        reject(error)
    }
});

但是对于我来说,在构造函数中一直进行这种手动错误检查似乎有点矫枉过正,同时例如在Promise的then方法中我不需要这样做。

因此,例如,以下解决方案也是如此,但没有手动错误处理:

Promise.resolve()
    .then(() => {
        throw new Error('error in the constructor');
    });

所以我的问题是,是否有更好的方法在Promise构造函数中进行错误处理?或者我应该使用最后一个例子,在我看来更清洁。

1 个答案:

答案 0 :(得分:3)

  

当谈到Promise构造函数时,您必须手动处理可能的错误   [...]
  当上述代码运行时,承诺永远不会得到解决(或拒绝)

你错误地认识到了这一点。在任何符合ES6的Promise实现中,当throw构造函数的解析器回调new Promise异常(同步)时,承诺将被拒绝。这throw - 安全性是favor the Promise constructor over the deferred pattern的一个引人注目的论据。