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构造函数中进行错误处理?或者我应该使用最后一个例子,在我看来更清洁。
答案 0 :(得分:3)
你错误地认识到了这一点。在任何符合ES6的当谈到Promise构造函数时,您必须手动处理可能的错误 [...]
当上述代码运行时,承诺永远不会得到解决(或拒绝)
Promise
实现中,当throw
构造函数的解析器回调new Promise
异常(同步)时,承诺将被拒绝。这throw
- 安全性是favor the Promise
constructor over the deferred pattern的一个引人注目的论据。