未处理的拒绝错误-为什么? //承诺链设计决策?

时间:2019-10-15 10:28:00

标签: javascript promise

A)请参见下面的代码。
如果我使用第// 1行,则会调用onError方法,没关系。
但是,如果我使用行// 2(并注释掉// 1),则仍会调用onError,但也会出现未处理的拒绝错误。为什么?这种情况迫使我像// 1中那样进行链接。如果我不进行链接,而是按原始承诺致电catch,那么我会得到unhandled rejection error

B)为什么呼叫p.thenp.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!");

1 个答案:

答案 0 :(得分:2)

要回答第一个问题,这很简单:

到达您提到的那几行时,您有2个Promise对象:一个由promise变量持有,另一个由p1变量持有。将catch直接链接到promise时,它不适用于then链接(存储在p1中)返回的承诺。 unhandled promise rejection error关于从then条款返回的承诺。

但是,当您将其链接到已经链接到p1的{​​{1}}时,promise子句将它们都覆盖了,因此这里没有错误。

essentailly的不同之处在于,行// 1可以捕获来自原始承诺然后是catch承诺的拒绝/错误,但是行// 2只能捕获来自原始承诺的拒绝,而拒绝{{1 }}未处理。

关于第二个问题,很抱歉,但对我来说太高了,我不想给出不完整/不正确的答案。