
链式Promise返回值
Promise 链的另一个重要方面是能够将数据从一个 Promise 传递到下一个 Promise。您已经看到传递给执行器内部 resolve() 处理程序的值被传递给该 Promise 的fullfilment handler。您可以通过指定fullfilment handler的返回值来继续沿链传递数据。 例如:
const promise = Promise.resolve(42);
promise.then(value => {
console.log(value); // 42
return value + 1;
}).then(value => {
console.log(value); // 43
});
Promise 的fullfilment handler在执行时返回值 + 1。 由于值是 42(来自执行程序),因此fullfilment handler返回 43。然后将该值传递给第二个promise的fullfilment handler,后者将其输出到控制台。
你可以对rejection handler做同样的事情。 当调用rejection handler时,它可能会返回一个值。 如果是这样,该值将用于传递到链中的下一个promise,如下所示:
const promise = Promise.reject(42);
promise.catch(value => {
// rejection handler
console.error(value); // 42
return value + 1;
}).then(value => {
// fulfillment handler
console.log(value); // 43
});
在这里,创建了一个值为 42 的rejection promise。该值被传递到该promise的rejection handler,其中返回值 + 1。即使这个返回值来自一个rejection handler,它仍然用于链中下一个promise的fullfilment handler 。 如果有必要,一个promise的失败可以让整个链恢复。
finally返回值(特殊情况)
然而,使用 finally() 会导致不同的行为。 从settlement handler返回的任何值都将被忽略,以便您可以访问原始promise的值。 这是一个例子:
const promise = Promise.resolve(42);
promise.finally(() => {
// settlement handler
return 43; // ignored!
}).then(value => {
// fulfillment handler
console.log(value); // 42
});
传递给fullfilment handler的值是 42 而不是 43。settlement handler中的 return 语句被忽略,以便可以使用 then() 检索原始值。 finally()的作用之一是返回从原始复制的promise,这个promise保留了原始状态和值。