Promise 构造函数中的错误处理

gsa*_*nta 0 javascript promise

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

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

让我举个例子:

new Promise(resolve => {
    throw new Error('error in the constructor');
    resolve();
});
Run Code Online (Sandbox Code Playgroud)

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

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

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

因此,例如以下解决方案执行相同的操作,但没有手动错误处理:

Promise.resolve()
    .then(() => {
        throw new Error('error in the constructor');
    });
Run Code Online (Sandbox Code Playgroud)

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

Ber*_*rgi 5

当涉及到 Promise 构造函数时,您必须手动处理可能出现的错误。
[…]
当上面的代码运行时,promise 永远不会得到解决(或拒绝)

你看错了。在任何符合 ES6 的Promise实现中,当构造函数的解析器回调中throw出现异常(同步)时,promise 将被拒绝new Promise。这个throw-safety 是支持Promise构造函数而不是延迟模式的令人信服的论据之一。