# fed-e-task-01-01 **Repository Path**: ternence07/fed-e-task-01-01 ## Basic Information - **Project Name**: fed-e-task-01-01 - **Description**: No description available - **Primary Language**: JavaScript - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2020-08-17 - **Last Updated**: 2020-12-19 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # fed-e-task-01-01 #### 简答题 谈谈是如何理解JS异步编程的,EventLoop、消息队列都是做什么的,什么是宏任务,什么是微任务? 【解析】 异步是相对于同步而言的,同步是一件事一件事的执行,而异步就是遇到一个异步任务,会将这个异步任务暂时挂起,继续执行后面的任务,再根据回调函数去完成异步任务。常用的异步模式有回调函数、事件监听、发布/订阅消息以及Promise。 EventLoop是一种程序结构,用于等待和发送消息以及事件。也就是说程序中会设置至少两个线程,一个负责程序本身的运行,一个与其他进程的通信,这个就是EventLoop。每当遇到异步或者JS主线程以外的操作时,主线程就让EventLoop线程去执行,然后接着往后运行,不需要进行等待。等到完成操作,EventLoop线程再把结果返回JS主线程。主线程就调用事先设定的回调函数,完成整个任务。 消息队列也称任务队列,是一个先进先出的队列,它里面存放着各种消息,即异步操作的回调函数,异步操作会将相关回调添加到任务队列中,而不同的异步操作添加到任务队列的时机也不同。在JS中,主线程在遇到异步操作的时候,会将该任务放到消息队列中,当主线程执行完当前循环的所有代码以后,就会从消息队列中取出该任务进行执行该任务的回调。 宏任务可以理解是每次执行栈执行的代码就是一个宏任务(包括每次从事件队列中获取一个事件回调并放到执行栈中执行)。浏览器会在下一个宏任务执行之前对页面进行重新渲染,宏任务包含:script(整体代码)、setTimeout、setInterval、I/O、UI交互事件、postMessage、MessageChannel、setImmediate(Node.js 环境) 微任务可以理解是在当前 task 执行结束后立即执行的任务。也就是说,在当前task任务后,下一个task之前,在渲染之前。在微任务执行完后,就会将其执行期间所产生的所有微任务都执行完成。微任务包含:Promise.then、Object.observe、MutaionObserver、process.nextTick(Node.js 环境)。 执行机制: 在事件循环中,每进行一次循环操作称为 tick,每一次 tick 的任务处理模型是比较复杂的,但关键步骤如下: 1.执行一个宏任务(栈中没有就从事件队列中获取) 2.执行过程中如果遇到微任务,就将它添加到微任务的任务队列中 3.宏任务执行完毕后,立即执行当前微任务队列中的所有微任务(依次执行) 4.当前宏任务执行完毕,开始检查渲染,然后GUI线程接管渲染 5.渲染完毕后,JS线程继续接管,开始下一个宏任务(从事件队列中获取)