每次对 then() 或 catch() 的调用实际上创建并返回了另一个 Promise ,仅当前一个Promise 被完成或拒绝时,后一个 Promise 才会被决议。研究以下例子:
p1第一次调用then之后,会再次返回一个成功决议的Promise(即使p1是失败的决议调用then之后也是返回成功决议的Promise)。之后每调用一次then,都会返回一个成功决议的Promise。
对一个Promise可以多次调用then进行成功或失败的处理,而不会出现第一调用后就失效了。
catch即可以处理reject结果还可以捕获Promise执行器里抛出的错误。
Promise 串行链允许你捕获前一个 Promise 的完成或拒绝处理函数中发生的错误
在此代码中, p1 的完成处理函数抛出了一个错误,链式调用指向了第二个 Promise 上的
catch() 方法,能通过此拒绝处理函数接收前面的错误。若是一个拒绝处理函数抛出了错
误,情况也是一样。
为了确保能正确处理任意可能发生的错误,应当始终在 Promise 链尾部添加拒绝处理函数。
Promise 链的另一重要方面是能从一个 Promise 传递数据给下一个 Promise 的能力。传递给
执行器中的 resolve() 处理函数的参数,会被传递给对应 Promise 的完成处理函数,这点你
前面已看到过了。你可以指定完成处理函数的返回值,以便沿着一个链继续传递数据。例
如:
p1 的完成处理函数在被执行时返回了 value + 1 。由于 value 的值为 42 (来自执行
器),此完成处理函数就返回了 43 。这个值随后被传递给第二个 Promise 的完成处理函数,
并被其输出到控制台。
你能对拒绝处理函数做相同的事。当一个拒绝处理函数被调用时,它也能返回一个值。如果
这么做,该值会被用于完成下一个 Promise 。
从完成或拒绝处理函数中返回一个基本类型值,能够在 Promise 之间传递数据,但若你返回
的是一个对象呢?若该对象是一个 Promise ,那么需要采取一个额外步骤来决定如何处理。
研究以下例子:
在此代码中, p1 安排了一个决议 42 的作业, p1 的完成处理函数返回了一个已处于决议
态的 Promise : p2 。由于 p2 已被完成,第二个完成处理函数就被调用了。而若 p2 被
拒绝,会调用拒绝处理函数(如果存在的话),而不调用第二个完成处理函数。
关于此模式需认识的首要重点是第二个完成处理函数并未被添加到 p2 上,而是被添加到第
三个 Promise 。正因为此,上个例子就等价于:
若p2是一个reject结果,则p3只会被传递给拒绝处理函数,这与返回基本类型的值不同(基本类型的值永远都会传给成功处理函数)。