返回博客列表
技术分享

关于`new Promise`的思考

一、为什么需要 Promise

早期 JavaScript 异步主要依赖 回调函数(callback)

fs.readFile("a.txt", function(err, data) {
  if (err) throw err;
  fs.readFile("b.txt", function(err, data2) {
    if (err) throw err;
    console.log(data2);
  });
});

存在的问题:

  • 回调嵌套严重(Callback Hell)
  • 可读性差
  • 错误处理困难

Promise 本质是一个表示“未来结果”的对象。


二、new Promise() 做了什么

基本写法:

const p = new Promise((resolve, reject) => {
  // 异步任务
});

执行流程:

  1. 创建 Promise 对象
  2. 立即执行 executor
  3. 提供 resolve / reject
  4. 管理 Promise 状态

三、Promise 三种状态

状态含义
pending等待中
fulfilled成功
rejected失败

状态流转:

pending → fulfilled
pending → rejected

状态一旦改变 不可逆


四、核心设计思想

1. 状态机

pending
  ↓
fulfilled / rejected

2. 异步结果容器

Promise 将 任务执行结果处理 分离:

const p = new Promise(task);
p.then(handleResult);

3. 链式调用

doA()
  .then(doB)
  .then(doC)
  .catch(handleError);

原因:

then() 会返回新的 Promise。


五、常见误区

1. 不必要的 Promise 包装

错误:

return new Promise(resolve => {
  fetch(url).then(res => resolve(res));
});

正确:

return fetch(url);

2. 同步代码使用 Promise

错误:

new Promise(resolve => resolve(1));

正确:

Promise.resolve(1);

3. 忘记 return

错误:

then(() => {
  fetch(url);
});

正确:

then(() => {
  return fetch(url);
});

六、典型使用场景

function delay(ms) {
  return new Promise(resolve => {
    setTimeout(resolve, ms);
  });
}

七、一句话总结

new Promise() 用于创建一个 管理异步状态并支持链式调用的对象


最后更新: 3/17/2026分享这篇文章