繁体   English   中英

“Promise.resolve”与“new Promise”构造函数中的不同错误处理

[英]Different error handling in “Promise.resolve” vs “new Promise” constructor

我自己做了一些测试,发现.then() 或.catch() 内部的错误处理程序没有在 Promise.resolve(value) 的“值”中捕获错误,但在 Promise 构造函数中捕获了错误 resolve(value) )。

我尝试了 Promise.resolve 和 promise 构造函数,其解析“值”会引发错误(尝试使用未定义的变量以及引发错误的外部 function)。 两者都有.then 和.catch 跟随。

我想我知道在 Promise.resolve 中,“值”在被“发送”到 then 之前被评估 - 所以 JavaScript 抛出一个异常并在它有机会被.then 或.catch 捕获之前将其全部关闭. 但是为什么 promise 构造函数中的 resolve(value) 不会发生同样的情况。

只是为了澄清:

在以下情况下,JavaScript 报告未处理的异常并且一切都停止:


Promise.resolve(someError)
    .catch(() => {
        console.error('This never gets printed');
    })

但...

在以下情况下, .catch 确实会捕获错误并打印其消息:


new Promise ((resolve, reject) => {
    resolve(someError)
})
    .catch(() => {
        console.error('This actually gets printed');
    })

Promise 构造函数行为

调用 promise 构造函数的语法是

Promise( executorFunction)

which results in Promise synchronously calling the executor function with two function arguments before returning the constructed promise. 通常调用 arguments resolvereject讨论。

To clean up edge cases, Promise returns a rejected promise if the executor throws before calling one of its arguments, with the rejection reason of the returned promise set to the thrown error. 另一方面,如果执行器同步调用resolvereject ,然后继续抛出错误,则返回的promise将根据function调用的参数解决或拒绝:抛出的错误将被忽略!

情况1

Promise.resolve(someError)
.catch(() => {
    console.error('This never gets printed');
})

在调用Promise.resolve方法之前,JavaScript 引擎评估要传递给该方法的参数。 如果评估带有语法或运行时错误的someError错误,代码执行会由于遇到的错误而停止。 “一切都停止了”, Promise.resolve没有被调用,也没有执行以下代码。

案例2

new Promise ((resolve, reject) => {
    resolve(someError)
})
.catch(() => {
    console.error('This actually gets printed');
})

这里someError在 executor 内部被评估为传递给resolve的参数。 由于它出错 JavaScript 引擎从不调用resolve 但是对于执行程序提前抛出的情况, Promise的定义行为是返回被拒绝的 promise,原因设置为抛出的错误。 稍后调用的.catch子句并打印 'This 实际上得到打印';

标准(固定链接)

如果执行器抛出异常,ECMA Script 2015 ("ES6") 标准要求构造函数在第 25.4.3.1 节的步骤 10 中调用返回的 promise 的rejectfunction 但是,如果已经同步解决或拒绝了 Promise 的 state,这不会影响它:如果之前调用了其中一对,则其他对resolve / reject函数的调用将被静默忽略。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM