TypeScript Promise

Promise 是异步编程的核心对象,表示"一个将来才完成的操作",用于解决回调地狱问题。TypeScript 用 Promise<T> 标注它最终会产出什么类型的值,让异步代码的类型全程可追踪。

1. 三种状态

  • pending:进行中,初始状态;
  • fulfilled:已成功,携带一个结果值;
  • rejected:已失败,携带失败原因。 状态一旦改变就不会再变,因此后续挂上的回调只会执行一次。

2. 创建 Promise

构造器接收执行器函数 (resolve, reject);泛型参数标注成功值的类型,失败值通常为 Error:

const p: Promise<string> = new Promise((resolve, reject) => {
    setTimeout(() => {
        const ok = true;
        if (ok) {
            resolve("加载完成");
        } else {
            reject(new Error("加载失败"));
        }
    }, 500);
});

3. then / catch / finally

then 处理成功值,catch 处理失败原因,finally 无论成败都会执行;三者都返回新的 Promise,可以继续链式调用:

p.then((msg: string) => console.log(msg)) // 输出:加载完成
    .catch((err: Error) => console.log(err.message))
    .finally(() => console.log("结束"));  // 输出:结束

4. Promise.resolve 与 reject

快速创建已成功或已失败的 Promise,常用于把同步值转成 Promise,或测试错误分支:

const a: Promise<number> = Promise.resolve(42);
const b: Promise<never> = Promise.reject(new Error("boom"));
a.then((n) => console.log(n));               // 输出:42
b.catch((e) => console.log(e.message));      // 输出:boom

5. 常用静态方法

Promise.all 等全部成功(一个失败则整体失败);Promise.race 取最先落定的一个;Promise.allSettled 等全部落定并分别返回结果,不因个别失败而中断:

const p1: Promise<number> = Promise.resolve(1);
const p2: Promise<number> = Promise.resolve(2);

Promise.all([p1, p2]).then((values: number[]) => console.log(values));
// 输出:[1, 2]

Promise.allSettled([p1, p2]).then((results) => {
    console.log(results[0].status); // 输出:fulfilled
});

小结

Promise<T> 的类型参数让异步结果可预测:创建用构造器或 resolve/reject,消费用 then/catch/finally,组合用 all/race/allSettled。下一节 async/await 将进一步简化 Promise 的写法。

笔记加载中…