promise 得到解决而不是被拒绝,甚至内在的 promise 也被返回
promise got resolved instead of rejected, even the inner promise returned
对于以下承诺链
new Promise(r=>r('b').then(()=>Promise.reject('x'))).catch(err=>console.log({error}))
返回内部承诺,因此它应该冒泡并被外部 catch
块捕获,并将错误记录到控制台。
但是,它得到了解决。
Promise {<fulfilled>: 'b'}
如何通过外部 catch 块捕获内部 promise?
r
(通常称为 resolve
)不是 return 承诺,因此对其调用 .then
是错误的。通常,如果在 promise 执行器函数(您传递的函数 new Promise
)中抛出错误,则正在创建的 promise 会因该错误而被拒绝。但是因为你已经调用了resolve
,你已经实现了"b"
的承诺,并且一旦实现就不能更改为被拒绝,所以错误在执行者期间发生的只是被抑制了。 (这是更一般规则的一个特殊情况,即一旦承诺 已解决 [与结果相关],它就不能以不同的方式解决。承诺可以在没有 [yet] 的情况下解决正在履行,但履行它是解决它的一种方式。如果您不是 100% 了解此承诺术语,请查看 my blog post here 对其进行解释。)
如果你想将你正在创建的承诺解析为另一个承诺,你将它传递给 resolve
函数:
new Promise(resolve => {
resolve(Promise.reject(new Error("x")));
})
.then(value => console.log("value", value))
.catch(error => console.error("error", error.message));
specific 示例将是 Explicit promise construction antipattern 的示例(我们应该直接使用 Promise.reject
中的承诺),但是如果您有分支promise 执行器中的逻辑和一些分支不涉及 promises,你可以做类似的事情(尽管从风格上来说,抛出错误或调用传递给执行器的 reject
函数对我来说更有意义).
对于以下承诺链
new Promise(r=>r('b').then(()=>Promise.reject('x'))).catch(err=>console.log({error}))
返回内部承诺,因此它应该冒泡并被外部 catch
块捕获,并将错误记录到控制台。
但是,它得到了解决。
Promise {<fulfilled>: 'b'}
如何通过外部 catch 块捕获内部 promise?
r
(通常称为 resolve
)不是 return 承诺,因此对其调用 .then
是错误的。通常,如果在 promise 执行器函数(您传递的函数 new Promise
)中抛出错误,则正在创建的 promise 会因该错误而被拒绝。但是因为你已经调用了resolve
,你已经实现了"b"
的承诺,并且一旦实现就不能更改为被拒绝,所以错误在执行者期间发生的只是被抑制了。 (这是更一般规则的一个特殊情况,即一旦承诺 已解决 [与结果相关],它就不能以不同的方式解决。承诺可以在没有 [yet] 的情况下解决正在履行,但履行它是解决它的一种方式。如果您不是 100% 了解此承诺术语,请查看 my blog post here 对其进行解释。)
如果你想将你正在创建的承诺解析为另一个承诺,你将它传递给 resolve
函数:
new Promise(resolve => {
resolve(Promise.reject(new Error("x")));
})
.then(value => console.log("value", value))
.catch(error => console.error("error", error.message));
specific 示例将是 Explicit promise construction antipattern 的示例(我们应该直接使用 Promise.reject
中的承诺),但是如果您有分支promise 执行器中的逻辑和一些分支不涉及 promises,你可以做类似的事情(尽管从风格上来说,抛出错误或调用传递给执行器的 reject
函数对我来说更有意义).