使用过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的第二个回调。
最后
好吧,我承认我很无聊