关于`new Promise`的思考
## 一、为什么需要 Promise 早期 JavaScript 异步主要依赖 **回调函数(callback)**: ```javascript 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()` 做了什么 基本写法: ```javascript 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 将 **任务执行** 与 **结果处理** 分离: ```javascript const p = new Promise(task); p.then(handleResult); ``` --- ### 3. 链式调用 ```javascript doA() .then(doB) .then(doC) .catch(handleError); ``` 原因: > `then()` 会返回新的 Promise。 --- ## 五、常见误区 ### 1. 不必要的 Promise 包装 错误: ```javascript return new Promise(resolve => { fetch(url).then(res => resolve(res)); }); ``` 正确: ```javascript return fetch(url); ``` --- ### 2. 同步代码使用 Promise 错误: ```javascript new Promise(resolve => resolve(1)); ``` 正确: ```javascript Promise.resolve(1); ``` --- ### 3. 忘记 return 错误: ```javascript then(() => { fetch(url); }); ``` 正确: ```javascript then(() => { return fetch(url); }); ``` --- ## 六、典型使用场景 ```javascript function delay(ms) { return new Promise(resolve => { setTimeout(resolve, ms); }); } ``` --- ## 七、一句话总结 > `new Promise()` 用于创建一个 **管理异步状态并支持链式调用的对象**。