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