promise 标准原理及实现
三个状态
- pending 筹备
- fulfilled 胜利
- rejected 失败
两个过程
(不可逆)
- pending -> fulfilled
- pending -> rejected
一个办法
- then 其余的 都是 then 派生的办法
Promise 数据结构
{ [[PromiseState]]: "fulfilled", // 外部状态 [[PromiseResult]]: 1 // 外部变量}
Promise Demo 运行阐明
const p = new Promise(function (resolve, reject) { console.log(0); setTimeout(() => { const number = parseInt(Math.random() * 100); const isOdd = number % 2; if (isOdd) { resolve(number); } else { reject(0); } }, 2000);});console.log(1);p.then((data) => { console.log(2);}).catch((err) => { console.log(3);});console.log(4);
- new Promise 属于同步执行
- setTimeout 会开启异步线程
- 程序 0 1 4 2
- Promise 的参数是一个函数,该函数同步执行
Promise 的参数 函数的参数, resolve reject 也是函数
resolve 作用
- promise 定义中调用,传入胜利后果
- 扭转 PromiseState 的状态为 fulfilled
- 设置 PromiseResult 值
reject 作用
- promise 定义中调用,传入失败起因
- 扭转 PromiseState 的状态为 rejected
- 设置 PromiseResult 值
then 办法
- 将监听函数退出队列
- 返回一个新的 promise
promise 实质
生产者生产之模式,new promise 和 then 中生产回调提供生产,then catch finally; 达到链式调用形式改善回调天堂的目标
简略实现
const PROMISE_STATE_ENUM = { PEDDING: "pendding", FULFILLED: "fulfilled", // 胜利 REJECTED: "rejected", // 失败};class MyPromise { callbacks = []; // 队列?数组?生产后出队? 还是应为 promise.All constructor(fn) { this.state = PROMISE_STATE_ENUM.PEDDING; this.result = void 0; // console.log("同步执行"); fn( function resolve(data) { if (this.state === PROMISE_STATE_ENUM.PEDDING) { this.state = PROMISE_STATE_ENUM.FULFILLED; this.result = data; this.callbacks.map((fn) => { fn(this.result); }); } }.bind(this), function reject() { this.state = PROMISE_STATE_ENUM.REJECTED; return this; }.bind(this) ); } then(onFulfilled, onRejected) { const self = this; let promise2; if (this.state === PROMISE_STATE_ENUM.PEDDING) { promise2 = new MyPromise(function (resolve, reject) { self.callbacks.push(() => { // setTimeout(function () { let x = onFulfilled(self.result); resolve(x); // }); }); }); } if (this.state === PROMISE_STATE_ENUM.FULFILLED) { console.log("getdata"); onFulfilled(this.result); } if (this.state === PROMISE_STATE_ENUM.REJECTED) { onRejected(this.result); } return promise2; } catch(onRejected) { this.then(null, onRejected) } finally() {} static all() {} static race() {} static allSettled() {} static any() {} static resolve(a) { return a; } static reject() {}}const p = new MyPromise(function (resolve, reject) { setTimeout(() => { if (1) { resolve("should data 123"); } else { reject("error"); } }, 300);});// console.dir(MyPromise);// console.log(p, "p");const p1 = p.then( (resolve) => { // console.log(resolve, ": then 1"); return 555 }, (error) => { console.log(error); });// console.log(p1, "p1");p1.then((data) => { // console.log(data, ": then 2");});// console.log(p, "p2");