Promise重要知识点

1、串联 Promise

每次对 then() 或 catch() 的调用实际上创建并返回了另一个 Promise ,仅当前一个Promise 被完成或拒绝时,后一个 Promise 才会被决议。研究以下例子:

p1第一次调用then之后,会再次返回一个成功决议的Promise(即使p1是失败的决议调用then之后也是返回成功决议的Promise)。之后每调用一次then,都会返回一个成功决议的Promise。

对一个Promise可以多次调用then进行成功或失败的处理,而不会出现第一调用后就失效了。

2、错误捕获

catch即可以处理reject结果还可以捕获Promise执行器里抛出的错误。

Promise 串行链允许你捕获前一个 Promise 的完成或拒绝处理函数中发生的错误

在此代码中, p1 的完成处理函数抛出了一个错误,链式调用指向了第二个 Promise 上的
catch() 方法,能通过此拒绝处理函数接收前面的错误。若是一个拒绝处理函数抛出了错
误,情况也是一样。

为了确保能正确处理任意可能发生的错误,应当始终在 Promise 链尾部添加拒绝处理函数。

3、在 Promise 链中返回值

Promise 链的另一重要方面是能从一个 Promise 传递数据给下一个 Promise 的能力。传递给
执行器中的 resolve() 处理函数的参数,会被传递给对应 Promise 的完成处理函数,这点你
前面已看到过了。你可以指定完成处理函数的返回值,以便沿着一个链继续传递数据。例
如:

p1 的完成处理函数在被执行时返回了 value + 1 。由于 value 的值为 42 (来自执行
器),此完成处理函数就返回了 43 。这个值随后被传递给第二个 Promise 的完成处理函数,
并被其输出到控制台。
你能对拒绝处理函数做相同的事。当一个拒绝处理函数被调用时,它也能返回一个值。如果
这么做,该值会被用于完成下一个 Promise 。

4、在 Promise 链中返回 Promise

从完成或拒绝处理函数中返回一个基本类型值,能够在 Promise 之间传递数据,但若你返回
的是一个对象呢?若该对象是一个 Promise ,那么需要采取一个额外步骤来决定如何处理。
研究以下例子:

在此代码中, p1 安排了一个决议 42 的作业, p1 的完成处理函数返回了一个已处于决议
态的 Promise : p2 。由于 p2 已被完成,第二个完成处理函数就被调用了。而若 p2 被
拒绝,会调用拒绝处理函数(如果存在的话),而不调用第二个完成处理函数。
关于此模式需认识的首要重点是第二个完成处理函数并未被添加到 p2 上,而是被添加到第
三个 Promise 。正因为此,上个例子就等价于:

若p2是一个reject结果,则p3只会被传递给拒绝处理函数,这与返回基本类型的值不同(基本类型的值永远都会传给成功处理函数)。