在 JavaScript 中,Promise 是一种用于处理异步操作的机制。它代表了一个在未来可能会完成或失败的操作,并且允许你对这些操作进行链式处理。
Promise 可以有三种状态:
- Pending(待定):初始状态,操作尚未完成。
- Fulfilled(已兑现):操作成功完成。
- Rejected(已拒绝):操作失败。
Promise 基本用法
Promise 主要有以下几个方法:
then():当 Promise 状态为 Fulfilled 时,执行成功回调。
catch():当 Promise 状态为 Rejected 时,执行失败回调。
finally():无论 Promise 状态如何,都会执行的回调。
示例1:创建一个 Promise
const myPromise = new Promise((resolve, reject) => {
let success = true; // 模拟异步操作成功或失败
if (success) {
resolve("操作成功"); // 如果操作成功,调用 resolve()
} else {
reject("操作失败"); // 如果操作失败,调用 reject()
}
});
// 使用 then() 处理成功的情况
myPromise.then((result) => {
console.log(result); // 输出: 操作成功
})
// 使用 catch() 处理失败的情况
.catch((error) => {
console.error(error); // 输出: 操作失败
});
myPromise 是一个异步操作,如果 success 为 true,则执行 resolve(),否则执行 reject()。
示例2:链式调用 then()
const myPromise = new Promise((resolve, reject) => {
let success = true;
if (success) {
resolve("操作成功");
} else {
reject("操作失败");
}
});
myPromise
.then((result) => {
console.log(result); // 输出: 操作成功
return "继续操作"; // 返回一个新的 Promise 或值,供下一个 then() 使用
})
.then((message) => {
console.log(message); // 输出: 继续操作
})
.catch((error) => {
console.error(error); // 处理任何异常
});
在这个例子中,then() 返回了一个新的值("继续操作"),这个值会被下一个 then() 处理。
示例3:Promise.all() 批量处理多个异步操作
Promise.all() 接受一个数组作为参数,当所有的 Promise 都成功时,返回一个新的 Promise,否则返回失败的 Promise。
const promise1 = new Promise((resolve) => setTimeout(resolve, 1000, "结果1"));
const promise2 = new Promise((resolve) => setTimeout(resolve, 2000, "结果2"));
const promise3 = new Promise((resolve) => setTimeout(resolve, 3000, "结果3"));
Promise.all([promise1, promise2, promise3])
.then((results) => {
console.log(results); // 输出: ["结果1", "结果2", "结果3"]
})
.catch((error) => {
console.error(error); // 如果有一个 Promise 失败,进入 catch
});
Promise.all() 等待所有的 Promise 都成功时,返回一个包含每个 Promise 结果的数组。如果其中一个 Promise 失败,整个 Promise.all() 会失败并进入 catch()。
示例4:Promise.race() 竞争条件
Promise.race() 接受一个 Promise 数组,返回第一个完成(无论是成功还是失败)的 Promise。
const promise1 = new Promise((resolve) => setTimeout(resolve, 2000, "结果1"));
const promise2 = new Promise((resolve) => setTimeout(resolve, 1000, "结果2"));
Promise.race([promise1, promise2])
.then((result) => {
console.log(result); // 输出: 结果2,因为它先完成
})
.catch((error) => {
console.error(error);
});
Promise.race() 会返回第一个完成的 Promise,无论其是成功还是失败。
示例5:finally() 最终处理
无论 Promise 是成功还是失败,finally() 都会执行,通常用于清理工作(如关闭加载动画等)。
const myPromise = new Promise((resolve, reject) => {
let success = true;
if (success) {
resolve("操作成功");
} else {
reject("操作失败");
}
});
myPromise
.then((result) => {
console.log(result); // 输出: 操作成功
})
.catch((error) => {
console.error(error); // 输出: 操作失败
})
.finally(() => {
console.log("无论成功还是失败,都会执行这里"); // 总会输出这行
});
finally() 不关心 Promise 的状态,它总会被执行,用于清理工作。
总结
Promise 是 JavaScript 用于处理异步操作的对象。
resolve() 用于标记异步操作成功,reject() 用于标记失败。
使用 then() 处理成功的结果,catch() 处理失败的情况,finally() 总会执行。
可以通过 Promise.all() 和 Promise.race() 来处理多个异步操作的组合和竞争。
通过使用 Promise,可以更清晰地组织和处理 JavaScript 中的异步代码,避免回调地狱问题。