前言
javascript是一门单线程脚本语言,在执行任务时需要一个一个去执行,一旦遇到非常耗时的任务时,就会导致阻塞,造成程序假死现象。针对这个问题,javascript便将执行的任务分为两类,即同步任务和异步任务。在主线程执行栈中执行程序时,若遇到异步任务,便将异步任务交给异步处理器进行处理,异步处理器将已完成的异步任务的回调函数放到异步队列中,等待执行,当主线程执行栈中的同步任务执行完毕后,会读取异步队列中的回调函数,按次序依次执行。知道了同步任务和异步任务的概念,下面我们来了解什么是事件循环(EventLoop)
宏任务和微任务
javascript将异步任务又进一步划分成了宏任务和微任务;
常见的宏任务有:Ajax请求、文件操作、setTimeout、setInterval
常见的微任务: Promise的then、catch、finally方法,Process.nextTick;
宏任务和微任务的执行顺序
便于理解的生活场景映射
①小云和小腾去银行办业务。首先,需要取号之后进行排队;
⚫宏任务队列
②假设当前银行网点只有一个柜员,小云在办理存款业务时,小腾只能等待
⚫单线程,宏任务按次序执行
③小云办完存款业务后,柜员询问他是否还想办理其它业务?
⚫当前宏任务执行完,检查是否有微任务
④小云告诉柜员:想要买理财产品、再办个信用卡、最后再兑换点马年纪念币?
⚫执行微任务,后续宏任务被推迟
⑤小云离开柜台后,柜员开始为小腾办理业务
⚫所有微任务执行完毕,开始执行下一个宏任务