这一次,彻底弄懂 Promise 原理
图解 Promise 实现原理
Promise|async|Generator 实现&原理大解析 | 9k字
Promsie其实就是一个状态机。当new Promise时传入的函数内部状态发生改变。就调用resolve reject。改变Prmise的状态,并执行 通过then方法传入的回调函数,从而实现一些异步业务。

Promise

Pending Fulfilled Rejected 一旦Promise被resolve或 reject,不能再迁移至其他状态。

极简的实现+链式调用 + 延迟机制 + 状态

  1. class Promise {
  2. callbacks = [];
  3. state = 'pending';//增加状态
  4. value = null;//保存结果
  5. constructor(fn) {
  6. fn(this._resolve.bind(this));
  7. }
  8. then(onFulfilled) {
  9. if (this.state === 'pending') {//在resolve之前,跟之前逻辑一样,添加到callbacks中
  10. this.callbacks.push(onFulfilled);
  11. } else {//在resolve之后,直接执行回调,返回结果了
  12. onFulfilled(this.value);
  13. }
  14. return this;
  15. }
  16. _resolve(value) {
  17. this.state = 'fulfilled';//改变状态
  18. this.value = value;//保存结果
  19. this.callbacks.forEach(fn => fn(value));
  20. }
  21. }

增加完状态之后,原先的_resolve中的定时器可以除掉了。
then方法中return了this,使得Promise实例可以多次调用then方法,但是是同一个实例,调用再多次then也只能返回相同的一个结果。希望then 返回的一定是一个新的Promise实例

完整的实现

  1. class Promise {
  2. callbacks = [];
  3. state = 'pending';//增加状态
  4. value = null;//保存结果
  5. constructor(fn) {
  6. fn(this._resolve.bind(this));
  7. }
  8. then(onFulfilled) {
  9. return new Promise(resolve => {
  10. this._handle({
  11. onFulfilled: onFulfilled || null,
  12. resolve: resolve
  13. });
  14. });
  15. }
  16. _handle(callback) {
  17. if (this.state === 'pending') {
  18. this.callbacks.push(callback);
  19. return;
  20. }
  21. //如果then中没有传递任何东西
  22. if (!callback.onFulfilled) {
  23. callback.resolve(this.value);
  24. return;
  25. }
  26. var ret = callback.onFulfilled(this.value);
  27. callback.resolve(ret);
  28. }
  29. _resolve(value) {
  30. this.state = 'fulfilled';//改变状态
  31. this.value = value;//保存结果
  32. this.callbacks.forEach(callback => this._handle(callback));
  33. }
  34. }

完整的实现+ reject

Generator/async-await

  1. function run(gen) {
  2. var g = gen() //由于每次gen()获取到的都是最新的迭代器,因此获取迭代器操作要放在step()之前,否则会进入死循环
  3. function step(val) { //封装一个方法, 递归执行next()
  4. var res = g.next(val) //获取迭代器对象,并返回resolve的值
  5. if(res.done) return res.value //递归终止条件
  6. res.value.then(val => { //Promise的then方法是实现自动迭代的前提
  7. step(val) //等待Promise完成就自动执行下一个next,并传入resolve的值
  8. })
  9. }
  10. step() //第一次执行
  11. }

async-await

  1. async function foo() {
  2. console.log(1)
  3. let a = await 100
  4. console.log(a)
  5. console.log(2)
  6. }
  7. console.log(0)
  8. foo()
  9. console.log(3)

image.png