Promise基础 #
一、Promise概述 #
Promise是JavaScript中处理异步操作的对象,代表一个异步操作的最终完成(或失败)及其结果值。
二、创建Promise #
2.1 基本语法 #
typescript
const promise = new Promise<string>((resolve, reject) => {
// 异步操作
setTimeout(() => {
resolve("成功");
}, 1000);
});
2.2 resolve和reject #
typescript
const success = new Promise<string>((resolve, reject) => {
resolve("成功结果");
});
const failure = new Promise<string>((resolve, reject) => {
reject(new Error("失败原因"));
});
2.3 封装异步操作 #
typescript
function delay(ms: number): Promise<void> {
return new Promise(resolve => setTimeout(resolve, ms));
}
async function example() {
console.log("开始");
await delay(1000);
console.log("1秒后");
}
example();
2.4 封装fetch #
typescript
function fetchJSON<T>(url: string): Promise<T> {
return new Promise((resolve, reject) => {
fetch(url)
.then(response => {
if (!response.ok) {
throw new Error(`HTTP ${response.status}`);
}
return response.json();
})
.then(data => resolve(data))
.catch(error => reject(error));
});
}
三、Promise状态 #
3.1 三种状态 #
typescript
// pending: 初始状态,既没有被完成,也没有被拒绝
// fulfilled: 意味着操作成功完成
// rejected: 意味着操作失败
const pending = new Promise(() => {}); // 永远pending
const fulfilled = Promise.resolve("成功");
const rejected = Promise.reject("失败");
3.2 状态不可变 #
typescript
const promise = new Promise<string>((resolve, reject) => {
resolve("第一次");
resolve("第二次"); // 被忽略
reject("失败"); // 被忽略
});
promise.then(value => console.log(value)); // "第一次"
四、链式调用 #
4.1 then方法 #
typescript
Promise.resolve(1)
.then(value => value + 1)
.then(value => value * 2)
.then(value => console.log(value)); // 4
4.2 返回Promise #
typescript
Promise.resolve(1)
.then(value => Promise.resolve(value + 1))
.then(value => Promise.resolve(value * 2))
.then(value => console.log(value)); // 4
4.3 传递值 #
typescript
fetch("https://api.example.com/users/1")
.then(response => response.json())
.then(user => user.name)
.then(name => console.log(name));
五、错误处理 #
5.1 catch方法 #
typescript
Promise.reject(new Error("出错了"))
.catch(error => {
console.error(error.message);
return "默认值";
})
.then(value => console.log(value)); // "默认值"
5.2 链式catch #
typescript
Promise.resolve()
.then(() => {
throw new Error("第一步失败");
})
.then(() => {
console.log("不会执行");
})
.catch(error => {
console.error(error.message);
});
5.3 finally方法 #
typescript
Promise.resolve("成功")
.then(value => console.log(value))
.catch(error => console.error(error))
.finally(() => console.log("清理工作"));
六、静态方法 #
6.1 Promise.resolve #
typescript
const p1 = Promise.resolve("值");
const p2 = Promise.resolve(Promise.resolve("嵌套"));
p1.then(v => console.log(v)); // "值"
p2.then(v => console.log(v)); // "值"(自动解包)
6.2 Promise.reject #
typescript
const p = Promise.reject(new Error("失败"));
p.catch(e => console.error(e.message)); // "失败"
6.3 Promise.all #
typescript
const promises = [
Promise.resolve(1),
Promise.resolve(2),
Promise.resolve(3)
];
Promise.all(promises)
.then(values => console.log(values)); // [1, 2, 3]
// 一个失败则全部失败
Promise.all([
Promise.resolve(1),
Promise.reject("失败"),
Promise.resolve(3)
]).catch(error => console.error(error)); // "失败"
6.4 Promise.allSettled #
typescript
const promises = [
Promise.resolve(1),
Promise.reject("失败"),
Promise.resolve(3)
];
Promise.allSettled(promises)
.then(results => console.log(results));
// [
// { status: "fulfilled", value: 1 },
// { status: "rejected", reason: "失败" },
// { status: "fulfilled", value: 3 }
// ]
6.5 Promise.race #
typescript
const promises = [
new Promise(resolve => setTimeout(() => resolve("慢"), 200)),
new Promise(resolve => setTimeout(() => resolve("快"), 100))
];
Promise.race(promises)
.then(value => console.log(value)); // "快"
6.6 Promise.any #
typescript
const promises = [
Promise.reject("失败1"),
Promise.resolve("成功"),
Promise.reject("失败2")
];
Promise.any(promises)
.then(value => console.log(value)); // "成功"
// 全部失败
Promise.any([
Promise.reject("失败1"),
Promise.reject("失败2")
]).catch(error => {
console.error(error.errors); // ["失败1", "失败2"]
});
七、实际应用 #
7.1 并行请求 #
typescript
async function fetchAll(urls: string[]): Promise<Response[]> {
const promises = urls.map(url => fetch(url));
return Promise.all(promises);
}
const responses = await fetchAll([
"https://api.example.com/users",
"https://api.example.com/posts",
"https://api.example.com/comments"
]);
7.2 带超时的请求 #
typescript
function fetchWithTimeout(
url: string,
timeout: number
): Promise<Response> {
return Promise.race([
fetch(url),
new Promise<never>((_, reject) =>
setTimeout(() => reject(new Error("Timeout")), timeout)
)
]);
}
7.3 重试机制 #
typescript
async function retry<T>(
fn: () => Promise<T>,
maxRetries: number = 3
): Promise<T> {
let lastError: Error | undefined;
for (let i = 0; i < maxRetries; i++) {
try {
return await fn();
} catch (error) {
lastError = error as Error;
console.log(`尝试 ${i + 1} 失败: ${lastError.message}`);
}
}
throw lastError;
}
八、总结 #
本章学习了:
- Promise的创建和状态
- 链式调用
- 错误处理
- 静态方法
- 实际应用场景
下一章,我们将学习async/await。
最后更新:2026-03-28