前端小白,第一次写技术文档,写的不好请多多担待,如有问题,欢迎指教。
前段时间,面试的时候,面试官经常会问到一个问题,如下:
var asyncfn = (async() => {
console.log("4");
})
asyncfn();
var timeout = setTimeout(() => {
console.log("5");
}, 0)
async function asyncFn() {
console.log(8);
const result = await new Promise((resolve, reject) => {
setTimeout(() => {
console.log(6);
resolve("result");
}, 0);
});
console.log(result);
console.log(7);
}
asyncFn();
new Promise((resolve, reject) => {
setTimeout(() => {
console.log(9)
})
}, 0)
var promise = new Promise((resolve, reject) => {
console.log("2");
})
console.log("1");
这个是我自己总结整理的这类型问题的汇总题型。
正确的答案是:4,8,2,1,5,6,result,7,9.
总结一下题目中所涉及到的知识点:
1.JS线程
js是单线程,js线程主要分为同步和异步,
同步:在主线程上排队执行的任务,只有前一个任务执行完,才能执行后一个任务.
异步:不进入主线程,进入队列任务,只有任务队列通知主线程,某个异步任务执行了,该任务才会进入主线程执 行.
任务队列:先进先出的数据结构,定时器还需要检查执行时间.
2.js的微观任务和宏观任务(在es6中区分了微观任务和宏观任务)
宏观任务是指宿主(例如浏览器)发起的任务,例如setTimeout
微观任务是指js引擎发起的任务,例如:promise
微观任务的优先级高于宏观任务,js在整个执行过程中是先读取所有的微观任务队列执行,再读取宏观任务队列执行.
3.async await
async也是一种异步方式,await 会暂停当前执行的async函数,等待await表达式后面的过程,跳过async函数,继续执行后面的代码,等待本轮同步任务执行完成之后再回来.
基于以上几个知识点,
所以先后执行的顺序是:
第一步:执行asyncfn方法,输出4,
第二步:setTimeout进入setTimeout任务队列
第三步:执行asyncFn方法,输出8,同时result后续方法等待,跳出await
第四步:执行promise,将setTimeout添加进入setTimeout任务队列
第五步:执行promise,输出2,
第六步:输出1,
第七步:执行setTimeout任务队列,输出5,6
第八步:await得到返回结果,执行await后续方法,输出result,和7
第九步,输出9.