then方法通过返回新promise实现链式调用,允许异步操作按顺序执行。1. then接受onfulfilled和onrejected回调,分别处理成功与失败;2. 回调执行结果决定新promise状态:返回值解决、抛出错误拒绝、返回promise则采纳其状态;3. 回调异步执行,确保一致性;4. 错误可沿链传递,集中处理;5. catch是捕获错误的语法糖,finally用于清理操作且不改变最终结果。

Promise的then方法,在我看来,就是Promise机制的心脏所在,是它将异步操作的最终结果(无论是成功还是失败)与后续处理逻辑连接起来的桥梁。它允许我们定义当一个异步操作成功完成(fulfilled)或失败(rejected)时应该执行的代码,并且更重要的是,它让异步操作可以像同步代码一样,以一种可读性极高的方式进行链式调用。

Promise.prototype.then() 方法用于注册当Promise状态变为resolved或rejected时要调用的回调函数。它最多可以接受两个参数:
onFulfilled:一个可选的回调函数,当Promise成功解决时被调用。它接收Promise的解决值作为唯一参数。onRejected:一个可选的回调函数,当Promise被拒绝时被调用。它接收Promise的拒绝原因作为唯一参数。then方法最关键的特性在于它总是返回一个新的Promise对象。这个新Promise的状态和值,取决于onFulfilled或onRejected回调函数的执行结果:

举个例子:
new Promise((resolve, reject) => {
// 模拟一个异步操作
setTimeout(() => {
const success = Math.random() > 0.5;
if (success) {
resolve("数据加载成功!");
} else {
reject("数据加载失败!");
}
}, 1000);
})
.then(
(data) => {
console.log("成功回调:", data);
return data + " - 进一步处理"; // 返回一个新值
},
(error) => {
console.error("失败回调:", error);
throw new Error("处理失败,需要中断链式调用"); // 抛出错误
}
)
.then(
(processedData) => {
console.log("第二次成功回调:", processedData);
return new Promise(res => setTimeout(() => res("完成!"), 500)); // 返回一个新Promise
}
)
.then(
(finalResult) => {
console.log("最终结果:", finalResult);
}
)
.catch(error => {
console.error("链式调用中捕获到错误:", error.message);
});我们为什么能像搭积木一样把异步操作串起来?这背后就是then方法返回一个全新Promise的魔力。每当你调用一个Promise的then方法,无论之前的Promise是成功还是失败,它都会给你一个新的Promise。这个新的Promise的状态和结果,完全由你then方法里提供的回调函数(onFulfilled或onRejected)的执行情况决定。

想象一下:第一个Promise完成了它的任务,然后它会把结果传递给第一个then的回调。这个回调函数执行后,它可能会返回一个普通值,或者抛出一个错误,甚至返回另一个Promise。无论哪种情况,then方法都会把这个结果“包装”成一个新的Promise。如果回调返回一个普通值,新Promise就以这个值成功解决;如果抛出错误,新Promise就以这个错误拒绝;如果返回的是另一个Promise,那么这个新Promise就会“等待”那个返回的Promise,直到它也解决或拒绝,然后新Promise会采用相同的状态和结果。
这种机制,我个人觉得是Promise设计中最精妙的地方。它允许我们把复杂的异步流程分解成一系列小的、可管理的步骤,每个步骤都可以独立地处理成功或失败,并且这些步骤可以无缝地连接起来,形成一个清晰的逻辑流。这比以前的层层嵌套回调(“回调地狱”)简直是天壤之别,大大提升了代码的可读性和可维护性。
jQuery图片内容展开/收缩选项卡,点击图片会出现对应的文字解说。兼容主流浏览器,php中文网推荐下载! 使用方法: 1、head区域引用以下文件
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号