【发布时间】:2018-11-25 19:48:12
【问题描述】:
我想知道是否有人知道承诺链如何引用下一个错误处理程序 - 例如:
const p = new Promise(resolve => resolve(5))
.then(v => 5*v)
.then(v => { throw 'foo' });
p.then(v => v/4)
.then(v => v+3)
.catch(e => console.error('first catch:', e));
p.then(v => v/4)
.then(v => v+3)
.catch(e => console.error('second catch:', e));
如果你运行它,你会得到:
first catch: foo
second catch: foo
据我所知,每次调用 Promise.prototype.then 时,都会创建并返回一个新的 Promise。为了保证能够为每个链找到 下一个错误处理程序,我能想到的唯一方法是拥有一个对子项的引用数组。因此,如果一个 Promise 被拒绝,它将遍历所有子节点,并在每个子链中找到最近的拒绝处理程序。
有人知道这是怎么实现的吗?
【问题讨论】:
-
const p 是一个被拒绝的承诺——你知道吗?重新阅读问题,我想你可能会这样做 - 抱歉
-
您要问的是实现细节,这取决于哪个浏览器(对于本机承诺)或哪个库(对于第 3 方承诺)。不过,一般来说,promise 需要跟踪其直系子级,以便在解决或拒绝时通知它们。他们不需要跟踪几个分离度的处理程序,因为每个
.then或.catch都会创建一个带有自己“孩子”的新承诺。
标签: javascript node.js ecmascript-6 es6-promise