Skip to content

Latest commit

 

History

History
47 lines (43 loc) · 2.66 KB

README.md

File metadata and controls

47 lines (43 loc) · 2.66 KB

handmade promsie

步骤

  1. 创建Promsie类
  2. 创建constractor构造函数
  3. 实现原型then方法和then的链式调用
  4. 实现Promsie对象方法 resolve,reject,race,all

promsie流程图

流程图

详细步骤

BAT前端经典面试问题:史上最最最详细的手写Promise教程 ⭐

理解

  1. new Peomise 传入一个exuctor(执行函数),执行函数有两个形参,resole和reject.
  2. resole和reject是两个回调函数,这两个函数的函数体已经在Promsie构造函数中定义, 它们只用于改变Promsie实例的状态. pending->fullfiled 等待->完成 pending->rejected 等待->失败 且过程不可逆
  3. Promise 原型上定义有then方法,then方法可以传两个参数, 分别是onResolved(成功的回调)和onRejected(失败的回调), then方法监听Promsie 实例的状态,当状态改变时,调用相应的回调方法. (then方法是如何监听 实例的状态变化的?)
  4. 待理解:then的链式调用,then的穿透,then方法中继续返回Promsie

Promise 的链式调用

promise().then(suc1)

为了讨论问题的简便,只讨论成功的链式调用情况

  1. 首先调用promise()方法会返回一个promise实例(promise1)
  2. then方法会实例化一个Promise对象(promise2)
  3. then方法会将suc1和promise2中的resolve方法组合为一个函数(SucCb1),推入promise1的成功回调队列
  4. promise1中的状态变为成功时,执行成功对列中的函数(SucCb1)
  5. SucCb1的执行过程
    • 执行suc1,获取suc1返回值(res)
    • 如果res不是一个Promise对象,执行promise2中的resolve(res),触发Promise2的成功回调队列
    • 如果res是一个Promise对象(promise3),直接调用promise3.then(suc2),卡住了

reference