技术分享
关于`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) => {
// 异步任务
});
执行流程:
- 创建 Promise 对象
- 立即执行 executor
- 提供
resolve/reject - 管理 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分享这篇文章