Promise.resolve()
.then(() => { // then1
throw "err1";
})
.then(() => { // then2
})
.catch((reason) => { // catch1
console.log(reason);
throw "err2";
})
.catch((reason) => { // catch2
console.log(reason);
});
如上面代码,then2 回调虽然不执行,但是如何跳到 catch2 的?
1
blackrabbit 2023-09-19 20:06:59 +08:00
then1 抛出错误,Promise 状态为 rejected ,会跳过 then2 直接进入 catch1 ,而 catch1 又抛出 err2 ,所以进入 catch2
|
2
DOLLOR 2023-09-19 20:40:56 +08:00
如果你时想了解 promise 的实现原理,可以去参考 bluebird 的实现:
https://github.com/petkaantonov/bluebird |
3
ochatokori 2023-09-19 20:43:13 +08:00 via Android
then2 和 catch2 并没有直接关系,catch2 的服务对象是 catch1 返回的 promise
|
4
Mutoo 2023-09-19 21:51:04 +08:00 1
1) .catch(fn) 只是 .then(null, fn) 的语法糖
2) 根据 https://github.com/promises-aplus/promises-spec 的第 7.II 条,then 会产生新的 promise ,当 onRejected 抛出异常的时候,新产生的 promise 会把新抛出的异常传递下去。而 7.III 如果 onRejected 没有返回值或抛异常,则将原来有状态传递下去。 另外可以参考一下 promise a+ 的 ployfill ,实现也就不到 200 行。 |
6
Vrds OP @blackrabbit 感谢指点
|
8
Vrds OP @ochatokori 感谢指点
|
9
mrcode 2023-09-19 22:21:25 +08:00
虽然老生常谈了,promise.then 的回调函数返回值会被不停的解析,直到非 promise 值出现
|