Promise 的 then() 方法可以返回一个非 Promise 的值(例如基本类型值、对象、数组等),这是非常常见的用法。这种情况下,then() 返回的新 Promise 会自动处理这个值,并对链式调用产生特定影响。
具体规则:
当 then() 的回调函数返回非 Promise 值时,then() 会创建一个状态为“成功(Fulfilled)”的新 Promise 对象,并将这个非 Promise 值作为新 Promise 的“成功结果”。
对链式调用的影响:
后续的 then() 会接收到这个非 Promise 值作为参数,并继续执行其成功回调,实现结果的无缝传递。这使得链式调用可以像“流水线”一样,对前一步的结果进行加工处理后传递给下一步。
示例:
Promise.resolve(10)
.then(num => {
// 返回非 Promise 值(数字)
return num * 2; // 新 Promise 状态为成功,结果为 20
})
.then(num => {
// 接收上一步的非 Promise 结果(20)
return `结果:${
num}`; // 返回字符串(非 Promise),新结果为 "结果:20"
})
.then(str => {
// 接收上一步的字符串结果
console.log(str); // 输出:"结果:20"
return {
data: str, status: "success" }; // 返回对象(非 Promise)
})
.then(obj => {
// 接收上一步的对象结果
console.log(obj.data); // 输出:"结果:20"
});
关键特点:
自动包装为成功的 Promise
非 Promise 值会被Promise.resolve()自动包装为成功状态的 Promise,因此后续的then()总能通过成功回调接收该值。同步值与异步值的统一处理
无论then()回调返回的是同步值(非 Promise)还是异步值(Promise),链式调用的处理逻辑保持一致,无需区分同步/异步,简化了代码。支持连续的数据转换
可以在链式调用中依次对数据进行转换(如格式处理、计算、过滤等),每一步的输出作为下一步的输入,逻辑清晰。
总结:
then() 方法返回非 Promise 值时,会被自动包装为成功状态的 Promise,后续的 then() 会接收该值并继续执行成功回调。这一特性让链式调用既能处理异步操作结果,也能无缝衔接同步的数据处理逻辑,是 Promise 链式调用灵活性的重要体现。