我们都知道,javaScript 是单线程的;
浏览器 通过拿到 j s 代码 传递给 js引擎 去执行, 引擎按顺序执行,这也就是宿主任务,
宿主任务:通过浏览器 去传递给js引擎去执行的任务;
当然 js 也可以通过 api 比如:setTimeout
, setInterval 等 让宿主在特定时机 传递给引擎执行
在es5之后 es6 引入了 Promise 可以执行异步代码
这样,不需要浏览器的安排,JavaScript 引擎本身也可以发起任务了。
我们把宿主发起的任务称为宏观任务,把 JavaScript 引擎发起的任务称为微观任务。
所以宏观任务包括:setTimeout,setInterval 等
微观任务:Promise.then(()=>{//微任务代码段}) 中执行的代码
微任务必须在宏任务之前执行。因为 在宏观任务中 JavaScript 可能产生 Promise 这样的异步代码
JavaScript 必须保证这些异步代码必须在一个宏观任务中完成,因此,每个宏观任务中又包含了一个微观任务队列:
看下面一个例子:
var r = new Promise(function(resolve, reject){
console.log("a");
resolve()
});
setTimeout(()=>console.log("d"), 0)
r.then(() => console.log("c"));
console.log("b")
打印结果为: a b c d
如何分析异步执行的顺序:
首先我们分析有多少个宏任务;
在每个宏任务中,分析有多少个微任务;
根据调用次序,确定宏任务中的微任务执行次序;
根据宏任务的触发规则和调用次序,
确定宏任务的执行次序;确定整个顺序。