三. 不使用 Promise 创建一个微任务
到这里我们可能会有疑问。我们可以直接像 setTimeout
那样很简单的创建一个宏任务一样创建微任务吗?你别说,还真有它就是挂在 window
对象身上的一个方法----queueMicrotask。
别觉得这个单词这么长就害怕,其实理解起来非常简单。微软公司怎么拼?MicroSoft对吧,那微任务不就是 MicorTask 吗?
使用方法非常简单,这个函数接受一个回调函数作为参数。和 setTimeout
一模一样的使用方法。
我们看一下控制台输出结果
四. 趁热打铁
是不是感觉好像悟了什么?哪我考考你,下面代码的运行结果是?
其实这个问题的关键点就在于这两个函数谁先执行?
这里我直接揭晓答案,其实不管是微任务还是宏任务,当队列中有多个任务在排队的时候,都遵循先进先出。就和现实生活排队一样,我先进去队里排队,自然而然我就是要先执行的。上面代码的执行顺序,先把 console.log("2")
放进了微任务队列,而 resolve("3") 是后一个微任务,那么自然在事件循环在主线程执行完回过头看微任务队列的时候,先看到的就是 console.log("2")
,那么它就先执行。
所以控制台上正确的显示结果就是
五. 思考题
我们稍微调整一下上面的代码,我仅仅只改动了一丢丢代码。
请你回答出上面代码在控制台的输出结果,写在评论区~🎁
如果你能准确回答出,说明后面的手写 Promise 一定不是什么问题~