[js线程]面试经常遇到的一道js线程问题

这篇博客主要介绍了JavaScript的单线程特性,以及同步和异步任务的执行顺序。重点讲解了微观任务和宏观任务的区别,包括setTimeout的执行时机。通过一道面试题,解析了任务执行的顺序,涉及知识点包括async/await的运行机制。正确执行顺序为:4,8,2,1,5,6,result,7,9。
摘要由CSDN通过智能技术生成

前端小白,第一次写技术文档,写的不好请多多担待,如有问题,欢迎指教。

前段时间,面试的时候,面试官经常会问到一个问题,如下:
在这里插入图片描述

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.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值