一道promise的小题目

112 阅读1分钟

使用过promise都知道,在then函数中,我们可以返回一个promise实例。当返回的是promise实例的时候,就要等promise实例被决议才可以继续调用下一个then的回调函数。

说的有点抽象,直接上代码把

不返回Promise

在此函数中,不返回promise实例,那么输出顺序是 then1 -> then1-1 -> then2

这是因为,第一个then的回调函数先进入回调队列,第二个then的回调函数后进入队列。

在第一个回调函数执行的时候,内含的第二个promise已经被决议了,那么其回调函数会立即执行。

返回Promise

好吧,其实结果是一样的。

那么我们再加点变化。看看到底返回promise有什么异同。

变体1:添加setTimeout,不返回promise

输出顺序变成了then1 -> then2 -> then1-1.

这里正是加了setTimeout,导致产生了宏任务。而宏任务是next Tick才会执行。因此then1-1会最后输出

变体2:添加setTimeout,返回promise

输出顺序又回到了 then1 -> then1-1 -> then2。

这就证明了当在onFulfilled/onReject函数返回一个new promise的时候,会一直等到其被决议。如果已经是决议状态的,会立即执行then函数传入的回调函数。

变体3:再加一个setTimeout呢?

输出顺序变成了 then1 -> then2 -> then1-1。

这里在第二个promise实例的then函数传入的回调函数内加了setTimeout这个宏任务。

可以看出then的回调函数是微任务,但是执行的时候遇到宏任务,那么宏任务的执行会到next Tick。

紧接着执行第一个promise的第二个回调。

最后

好吧,我承认我很无聊