谈谈promise,谈谈微任务
- javascript 的异步执行机制,思路基本上是这样的,先执行同步任务,然后执行异步微任务,然后执行异步宏任务
- 还说什么,宏任务是 setTimeOut这些,然后微任务是 promise这些
- 其实,在早些时候,我就测试过setTimeOut和promise的异步执行优先级,那个时候我就知道 promise的异步执行优先级 是要高于 setTimeOut的,如果你告诉我因为 setTimeOut是异步宏任务,promise是异步微任务,因为是先执行微任务,然后执行异步宏任务,因此,promise的异步优先级要比 setTimeOut要高,我想说这和没说是一样的
如何创建一个微任务?
- 我不知道有没有人想过这个问题,可能你会觉得直接使用 promise就可以创建一个微任务,但是,如果不使用 promise呢?
- 事实上,这个问题就已经问到了 promise异步执行的本质了
- 这个问题必须要搞懂,因为接下来我要使用 javascript原生实现一个真正的 promise
- 为此我看了很多 promise原生实现的博客,希望能找到 实现微任务的蛛丝马迹,但是绝大多数的博客的 promise原生实现的异步实现方式(或者说 微任务),都是基于 setTimeOut,这很明显就已经脱离了 promise基于微任务的本质了
直接看 promise的源代码
- 没办法,为了找到 微任务的实现方式,我只能去看 promise的源代码,因为 promise的异步机制就是基于微任务
- 在这里有一个忠告,如果你想真正理解一个原理,直接看源代码是最好最直接的
- 还真给我找到了,请看:(以下是 promise的源代码)
- 这个函数引起了我的关注,因为在文件的他引入了一个插件
- 这就是微任务的本质
- 使用这个插件就可以创建一个微任务,使用 npm i asap可以直接下载
- 当然了,但这里我也就不继续深究了,因为 这已经可以让我实现一个原生的 promise了,但是如要继续深究的话,会涉及到 javascrip更底层的代码
现在来创建一个微任务
var asap = require("asap/raw")
asap(function(){
console.log("center...")
})
- 这就是一个简单的微任务,可能你会觉得有点假,现在拿他来和 异步宏任务 setTimeOut比较一下 异步优先级
var asap = require("asap/raw")
setTimeout(()=>{
console.log("header...")
},0)
asap(function(){
console.log("center...")
})
console.log("footer...")
- 如果这真的是微任务的话,那么,结果应该是 footer,center,header
- 看到了吗,这就是微任务的创建方式,有了这个就可以实现原生实现一个 promise了
下一章我在原生实现一个 promise