Promise
JavaScript 中处理异步操作的对象,代表一个"现在还没有结果,但将来会有结果"的值。
三种状态
pending(进行中)→ fulfilled(成功)
→ rejected(失败)
一旦从 pending 变为 fulfilled 或 rejected,状态就不可逆,这叫"settled"(已敲定)。
基本用法
// 创建一个 Promise
const fetchData = new Promise<string>((resolve, reject) => {
setTimeout(() => {
const success = true;
if (success) {
resolve("数据获取成功"); // 成功时调用
} else {
reject(new Error("失败了")); // 失败时调用
}
}, 1000);
});
// 消费这个 Promise
fetchData
.then((result) => console.log(result)) // 处理成功
.catch((err) => console.error(err)) // 处理失败
.finally(() => console.log("结束")); // 无论成功失败都执行async/await 语法糖
现代写法更常用 async/await,本质上还是 Promise:
async function getData() {
try {
const result = await fetchData; // 等待 Promise resolve
console.log(result);
} catch (err) {
console.error(err);
}
}await 只能用在 async 函数里,它会"暂停"函数执行,直到 Promise 敲定,但不会阻塞主线程(这是 JS 单线程事件循环的精髓)。
常用静态方法
romise.all([p1, p2, p3]) // 全部成功才成功,一个失败就失败
Promise.allSettled([p1, p2]) // 等所有都敲定,不管成功失败
Promise.race([p1, p2]) // 谁先敲定就用谁的结果
Promise.any([p1, p2]) // 只要有一个成功就成功