TypeScript中Promise用法详解与异步编程实践
时间:2026-08-14 | 作者:清风无痕 | 阅读:0Promise 是 Ja vaScript 异步编程的基础,TypeScript 对 Promise 有完整的类型支持。
通过泛型参数,可以精确地指定 Promise 解决值和拒绝值的类型。
为什么需要 Promise
在 Ja vaScript 中,很多操作是异步的,如网络请求、文件读取、定时器等。
Promise 提供了统一的异步编程接口,让异步代码更容易编写和管理。
TypeScript 通过泛型支持,让 Promise 的类型安全得到了保障。
概念说明:Promise 本质上是一个对象,用来承载一次异步操作最终会走向什么结果。
它一共只有三种状态:pending(进行中)、fulfilled(已成功)、rejected(已失败)。
创建 Promise
使用 Promise 构造函数创建 Promise,并传入执行器函数。
实例
// 创建 Promise,使用泛型指定解决值的类型
// Promise 表示成功时返回字符串
var promise = new Promise(function(resolve, reject) {
var success = true;
if (success) {
// 调用 resolve 表示操作成功,传入结果值
resolve("成功!");
} else {
// 调用 reject 表示操作失败,传入错误
reject(new Error("失败"));
}
});
// 使用 then 处理成功情况
promise.then(function(value) {
console.log("完成: " + value);
})["catch"](function(error) {
// 使用 catch 处理失败情况
console.log("错误: " + error.message);
});
运行结果:
完成: 成功!
泛型说明:
Promise中的 T 是 Promise 成功解决时的值的类型。
这让 TypeScript 能够推断返回值的类型。
Promise 链式调用
then 和 catch 方法返回新的 Promise,因此可以链式调用。
实例
// 链式调用:每个 then 返回新的值,被下一个 then 接收
var promise = Promise.resolve(1)
.then(function(n) {
// 第一个 then,n = 1
return n * 2; // 返回 2
})
.then(function(n) {
// 第二个 then,n = 2
return n + 10; // 返回 12
})
.then(function(n) {
// 第三个 then,n = 12
console.log("最终结果: " + n);
return n;
});
console.log("Promise 链: " + promise);
运行结果:
最终结果: 12
Promise 链: [object Promise]
链式调用:每个 then 会返回一个新的 Promise。
这允许我们按顺序执行多个异步操作。
Promise.all
Promise.all 等待所有 Promise 完成,并返回一个包含所有结果的数组。
实例
// 创建三个 Promise
var p1 = Promise.resolve(1);
var p2 = Promise.resolve(2);
var p3 = Promise.resolve(3);
// Promise.all 等待所有 Promise 完成
// 返回一个数组,包含所有 Promise 的结果
Promise.all([p1, p2, p3]).then(function(results) {
console.log("全部完成: " + results);
// 计算总和
console.log("总和: " + results.reduce(function(a, b) { return a + b; }, 0));
});
运行结果:
全部完成: 1,2,3
总和: 6
注意:如果任何一个 Promise 失败,Promise.all 会立即 rejection,不会等待其他 Promise 完成。
Promise.race
Promise.race 返回最先完成的 Promise 的结果,无论成功或失败。
实例
// 创建三个不同延迟的 Promise
var p1 = new Promise(function(resolve) {
setTimeout(function() { resolve("p1"); }, 100);
});
var p2 = new Promise(function(resolve) {
setTimeout(function() { resolve("p2"); }, 50);
});
var p3 = new Promise(function(resolve) {
setTimeout(function() { resolve("p3"); }, 30);
});
// Promise.race 返回最先完成的 Promise 的结果
Promise.race([p1, p2, p3]).then(function(value) {
console.log("最先完成: " + value);
});
运行结果:
最先完成: p3
应用场景:Promise.race 常用于实现超时功能。
做法是把一个长时间操作的 Promise 和一个超时 Promise 竞争。
Promise.allSettled
Promise.allSettled 等待所有 Promise 结束,无论成功或失败。
它会返回每个 Promise 的状态和结果。
实例
// 创建三个 Promise,其中一个会失败
var p1 = Promise.resolve("成功");
var p2 = Promise.reject(new Error("失败"));
var p3 = Promise.resolve("完成");
// Promise.allSettled 等待所有 Promise 结束
// 返回每个 Promise 的状态和值/reason
Promise.allSettled([p1, p2, p3]).then(function(results) {
results.forEach(function(result, index) {
if (result.status === "fulfilled") {
console.log("Promise " + index + ": " + result.value);
} else {
console.log("Promise " + index + ": " + result.reason.message);
}
});
});
运行结果:
Promise 0: 成功
Promise 1: 失败
Promise 2: 完成
区别:Promise.all 会在第一个失败时立即停止。
Promise.allSettled 会等待所有 Promise 结束。
Promise 类型注解
TypeScript 的泛型支持让 Promise 的类型声明变得精确。
实例
// 定义返回 Promise 的函数
// Promise<{ name: string; age: number }> 指定了返回的用户对象类型
function getUser(): Promise<{ name: string; age: number }> {
return Promise.resolve({ name: "Alice", age: 25 });
}
// async 函数:隐式返回 Promise
async function main() {
// await 会自动推断 user 的类型
var user = await getUser();
console.log("用户: " + JSON.stringify(user));
}
main();
类型推断:TypeScript 会自动根据泛型参数把 Promise 的返回类型推出来。
因此在 async/await 这类写法里,类型提示通常也能保持完整,不容易丢信息。
注意事项
- 泛型参数:始终为 Promise 指定泛型参数,明确返回类型
- 错误处理:记得使用 catch 处理 Promise 失败的情况
- all vs allSettled:需要全部结果时用 allSettled,需要快速失败时用 all
- async/await:现代代码推荐使用 async/await,语法更简洁
最佳实践:优先使用 async/await 语法,它本质上还是基于 Promise,但写起来像同步代码。
总结
Promise 是 TypeScript 异步编程的核心。
- Promise:异步操作容器,有 pending/fulfilled/rejected 三种状态
- then/catch:链式处理异步结果
- Promise.all:等待全部完成,任一失败则整体失败
- Promise.race:返回最先完成的结果
- Promise.allSettled:等待全部结束,返回每个的状态
建议:使用 async/await 语法配合 Promise,让异步代码既类型安全又易于阅读。
免责声明:文中图文均来自网络,如有侵权请联系删除,心愿游戏发布此文仅为传递信息,不代表心愿游戏认同其观点或证实其描述。
相关文章
更多-
- 打破多年惯例!小米18缺席9月发布会 卢伟冰:不会让大家等太久
- 时间:2026-08-25
-
- C# 里字段(Field)和属性(Property)到底怎么区分?一篇讲清职责、写法与选型
- 时间:2026-08-24
-
- 突破500万分、十核全大核设计!小米晒玄戒O3性能:领先苹果A19 Pro
- 时间:2026-08-24
-
- 红米Note12 Pro扩容内存必须获取root权限吗
- 时间:2026-08-24
-
- 华硕天选7 Pro与Max游戏本发布 售价10399元起
- 时间:2026-08-23
-
- 红米K20 Pro微信悬浮窗开启方法与使用教程
- 时间:2026-08-23
-
- 红米Note12 Pro与Note12续航对比实测
- 时间:2026-08-23
-
- 红米Note12T Pro电池容量与详细配置参数介绍
- 时间:2026-08-23
精选合集
更多大家都在玩
大家都在看
更多-
- 为什么湿头发更容易断裂 蚂蚁庄园今日答案9.15
- 时间:2026-09-14
-
- 蚂蚁庄园今天答题答案2026年9月15日
- 时间:2026-09-14
-
- 蚂蚁庄园答题今日答案2026年9月15日
- 时间:2026-09-14
-
- 蚂蚁庄园小课堂2026年9月15日最新题目答案
- 时间:2026-09-14
-
- 小鸡答题今天的答案是什么2026年9月15日
- 时间:2026-09-14
-
- 蚂蚁庄园每日答题答案2026年9月15日
- 时间:2026-09-14
-
- 糖尿病患者禁食所有含糖食物吗 蚂蚁庄园今日答案9月15日
- 时间:2026-09-14
-
- 2026年9月14日蚂蚁新村答案
- 时间:2026-09-14
