Promise 解析
为啥要使用它?
- 地域回调问题,以前的 前端处理异步请求,往往都是多层嵌套实现,数据请求。导致很多问题出现。Promise 的出现基本解决(加上async、await 就更完美了)。
- 更好的error 处理;可以集中的在catch()处理 错误。
- Promise 有统一的异步处理操作,可以异步达到类似同步的效果。
- 并发控制
- [ all] 可以并行处理多个异步
- [rece] 等待多个 Promise 中的任何一个完成(或失败),然后根据第一个完成的 Promise 进行操作。这可以用于超时处理或竞争条件。
8.提高代码的可读性 和可维护性then()、catch(),很好的分离的正常 和异常操作。
核心原理
- 状态不可逆:Promise 对象代表一个异步操作,有三种状态:pending(等待态)、fulfilled(完成态)、rejected(失败态)。从 pending 到 fulfilled 或从 pending 到 rejected,状态一旦改变就不能再变-单向不可逆。
- Executor 函数:Promise 的执行器(Executor)函数在 Promise
构造函数执行时立即调用,它接受两个参数:resolve 和 reject。这两个参数都是函数,由 JavaScript引擎提供,不需要自己实现。执行器中通过调用 resolve 和 reject 来改变 Promise 的状态。 - 异步与微任务(Microtask):Promise 的回调通过任务队列实现异步执行。当调用 resolve 或 reject时,相应的处理函数(.then 或 .catch 中注册的回调)不会立即执行,而是放入一个任务队列中。只有当 JavaScript
- 链式调用:每次调用 .then 或 .catch 都会返回一个新的
Promise,从而实现链式调用。通过这种方式,可以顺序执行多个异步操作,并在每一步中根据前一个操作的结果进行相应处理。 - 与 async/await 的整合:Promise 是 async/await 语法的基础,这使得异步代码可以像同步代码那样书写和理解,进一步提高了开发效率和代码质量。
简易版Promise
class SimplePromise {
constructor(executor) {
this.state = 'pending';
this.value = undefined;
this.reason = undefined;
const resolve = (value) => {
if (this.state === 'pending') {
this.state = 'fulfilled';
this.value = value;
}
};
const reject = (reason) => {
if (this.state === 'pending') {
this.state = 'rejected';
this.reason = reason;
}
};
try {
executor(resolve, reject);
} catch (err) {
reject(err);
}
}
then(onFulfilled, onRejected) {
if (this.state === 'fulfilled') {
onFulfilled(this.value);
}
if (this.state === 'rejected') {
onRejected(this.reason);
}
}
}