暑期实习好难找,前端面试学习之JS 异步
关于JS的问答题
1.请描述event loop(事件循环)的机制,可画图
答:同步代码一行一行在call stack中执行;遇到异步代码会记录下来,等待时机;时机到了,就会移动到Callback queue;如果call stack为空(同步代码执行完),Event loop开始工作,轮询查找callback Queue,若查找到则移动到call stack中;然后一直查找下去
JS是单线程的,异步(setTimeout,ajax)使用回调,基于event loop;DOM事件也使用回调,基于event loop
2.什么是宏任务和微任务,两者有什么区别
宏任务:setTimeout, setInterval, Ajax, DOM事件 浏览器规定 微任务:promise async/await 微任务执行时机比宏任务早 ES6语法规定
PS:
(1) 为什么微任务比宏任务早?
JS是单线程的,并和DOM渲染共用一个线程 JS执行的时候,需要留有一些时机给DOM渲染 每次call stack清空(每次轮询结束),同步代码执行完,都是DOM树重新渲染的机会,DOM结构如有改变则重新渲染;然后再触发下一次event loop
(2) 微任务、宏任务和DOM渲染的关系
宏任务在DOM渲染后触发,如seTimeout; 微任务在DOM渲染前触发,如Promise
(3)微任务、宏任务和DOM渲染在event loop的过程
3.Promise有哪三种状态?如何变化
进行中 pending 已完成 resolved 已拒绝rejected pending状态,不会触发then和catch; resolved状态会触发then;rejected状态会触发catch then/catch正常返回resolved;报错返回rejected 链式调用(基于回调函数),平铺开,避免回调地狱。
关于JS的场景题:
1.Promise then和catch的连接
2.async/await语法,
是很香的一个语法糖 (与promise的关系) 解决异步回调callback hell ; 是同步语法,彻底消灭了回调函数; 与promise并不互斥; 执行async函数,返回的是promise对象; await相当于promise的then; try...catch可捕获异常,代替了promise的catch
3.Promise和setTimeout的顺序
4.Async/await顺序
手写promise 初始化&异步调用 then/catch链式调用 API .resolve .reject .all .race