基本概念比灵活的运用更加重要。理解了基本概念,才不会在数量巨大的名词前迷失。
Javascript的promise的概念有时候,容易让人迷惑。我们从网上找了一段又一段的示例代码,希望以此来让知道搞清楚,到底promise是什么。但是我们还是在promise的各种概念中,不知所措。
在下面的描述中,一般不关注reject。reject的过程其实是和fullfill类似。
fullfilled与resolve的区别
fullfilled是一个状态。当状态为fullfilled的时候,promise已经达到了一个值,而且这个值不会再更改了。而resolve是一个过程,当resolve时,是否fullfilled,还要,嗯,看情况。我们需要讨论讨论,研究研究。
一些简单的背景
promise是未来事件的封装
这是容易理解的一部分,就是现在还没有发生的一件事情,将来会发生。
通过then方法注册未来事件的回调
这个也容易理解,就是fullfilled时或者rejected时要调的回调函数,是通过promise.then(onFulfilled, onRejected)进行处理。
resolve的过程
按照规范,then方法返回一个promise。所以形式上应该写成
promise2 = promise1.then(onFullfilled, onRejected)
不简单的事情
不简单的就是onFullfilled的不同,而处理会非常地不同,这也是promise容易把人搞昏头的地方。
形式1,onFullfilled是函数
那么当它返回一个值x时,要走[[resolve]](promise1, x)的流程。
形式2,onFullFilled不是函数
那么如果promise1 fullfilled的时候,promise2也fullfilled了。也就是promise要跟随promise1的fullfilled状态。
问题又来了,如果这时候promise1没有fullfilled怎么办呢,我们就说,不可能,因为如果promise1没有fullfilled,就不会来调用它的then方法,也就不会来检查onFullFilled参数是个什么东西。
resolve流程
也得分两种情况,x如果是thenable,也就是它得有一个then这样的方法,也就是说象是一个promise的对象。如果不是,情况简单,直接将x作为fullfilled的值。
thenable的处理流程
又细分为两种情况,一种是x是promise
- 如果x已经不是处于pending状态,则一直要等待x不处于pending状态再做决定。也就更说promise2这时候,也得是pending状态。
- 如果x已经是fullfilled,则promise2也会以相同的值fullfill。
- 如果x已经是rejected了,同理。
另外一种情况是x是一个object。流程也很清晰的:
- 首先获取y=x.then
- 如果y不是function,拿它来fullfill我们的promise2
- 这时候,y肯定是一个function了,又得来调用它了,这时候,其实和构造Promise差不多的,又是新一轮的循环。
兜底的catch
在处理的流程内部,无论何时出现了异常,都能够catch住,也就是onRejected会被调用。
网友评论