A)请参见下面的代码。
如果我使用第// 1
行,则会调用onError
方法,没关系。
但是,如果我使用行// 2
(并注释掉// 1
),则仍会调用onError
,但也会出现未处理的拒绝错误。为什么?这种情况迫使我像// 1
中那样进行链接。如果我不进行链接,而是按原始承诺致电catch
,那么我会得到unhandled rejection error
。
B)为什么呼叫p.then
和p.catch
没有返回原始承诺p
?我觉得这很奇怪。在我看到允许链接的所有库中,返回了原始对象(即this
对象)。在JavaScript中,当我们执行promise1.then(...)
时,将返回一个新的promise2
而不是promise1
。我觉得这很奇怪。这背后的逻辑推理是什么?在我看来,这似乎是不必要的并发症,甚至是一种不好的做法。使用JavaScript时还需要记住另一个gotcha
。但是,好吧……我敢肯定,聪明的人决定采用这种方法,所以……这一决定背后的原因是什么?有任何想法吗?
function onSuccess () {
console.log('Success occurred!')
}
function onError () {
console.log('Error occurred!')
}
const promise = new Promise((resolve, reject) => {
setTimeout(() => {
reject()
}, 2000)
})
var p1 = promise.then(onSuccess);
var p2 = p1.catch(onError); // 1 //
// var p2 = promise.catch(onError); // 2 //
console.log("DONE!");
答案 0 :(得分:2)
要回答第一个问题,这很简单:
到达您提到的那几行时,您有2个Promise对象:一个由promise
变量持有,另一个由p1
变量持有。将catch
直接链接到promise
时,它不适用于then
链接(存储在p1
中)返回的承诺。 unhandled promise rejection error
关于从then
条款返回的承诺。
但是,当您将其链接到已经链接到p1
的{{1}}时,promise
子句将它们都覆盖了,因此这里没有错误。
essentailly的不同之处在于,行// 1可以捕获来自原始承诺然后是catch
承诺的拒绝/错误,但是行// 2只能捕获来自原始承诺的拒绝,而拒绝{{1 }}未处理。
关于第二个问题,很抱歉,但对我来说太高了,我不想给出不完整/不正确的答案。