promise then err_promise原理和实现

v2-859f6918e6e2ef2652a0b1765ab83718_1440w.jpg?source=172ae18b

规范

promise有多种规范,像 promise/A、 promise/B、 promise/D 以及 promise/A 的升级版 promise/A+。

ES6中采用的规范是promise/A+。

状态

一个promise的状态只有三种:等待态Pending、执行态Fulfilled和拒绝态Rejected。

  • 处于等待态时,promise可以迁移到执行态或者拒绝态。
  • 处于执行态时,promise不能迁移到其他任何状态,且必须拥有一个不可变的终值。
  • 处于拒绝态时,promise不能迁移到其他任何状态,且必须拥有一个不可变的据因。

代码结构

构造函数

function 

方法

Promise

实现构造函数

由上述对于promise状态的描述,可以得到以下的构造函数。

function 

Then方法

一个promise必须提供一个then方法可以访问其当前值、终值和据因。promise的then方法接受两个参数:

promise

onFulfilled和onRejected都是可选的参数

  • 如果onFulfilled不是函数,其必须被忽略
  • 如果onRejected不是函数,其必须被忽略

且then方法必须返回一个promise对象:

promise2 

且onFulfilled和onRejected不能同步调用,必须异步调用。

实现then

Promise

链式调用

在使用promise的时候经常用到new Promise().then().then()的写法,这个就是链式调用了。

之前的then方法已经默认返回了一个promise,但是还没有完全实现链式调用的写法。还需要将这个promise2返回的值传递到下一个then中去。

如果在第一个then方法中return了一个值,这个值就称为x。需要对x进行判断,从而根据x的值来改变promise2的状态,而判断x的函数叫做resolvePromise。

  • 如果 onFulfilled 或者 onRejected 返回一个值 x ,则运行下面的 Promise 解决过程:[[Resolve]](promise2, x)
  • 如果 onFulfilled 或者 onRejected 抛出一个异常 e ,则 promise2 必须拒绝执行,并返回拒因 e
  • 如果 onFulfilled 不是函数且 promise1 成功执行, promise2 必须成功执行并返回相同的值
  • 如果 onRejected 不是函数且 promise1 拒绝执行, promise2 必须拒绝执行并返回相同的据因

promise解决过程

如果 x 为对象或者函数:

  • 把 x.then 赋值给 then
  • 如果取 x.then 的值时抛出错误 e ,则以 e 为据因拒绝 promise
  • 如果 then 是函数,将 x 作为函数的作用域 this 调用之。

如果 x 不为对象或者函数,以 x 为参数执行 promise

实现resolvePromise

function 

之后可以将then方法修改如下:

Promise

完整代码

var 

参考地址

Promises/A+​promisesaplus.com Promise原理与实现​www.jianshu.com
v2-4e01073205e7fb3285ce84b915ac8bb6_ipico.jpg
【翻译】Promises/A+规范-图灵社区​www.ituring.com.cn BAT前端经典面试问题:史上最最最详细的手写Promise教程 - 掘金​juejin.im
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值