赞
踩
在JavaScript的执行环境中,事件循环(Event Loop)是实现非阻塞异步执行的关键机制。它由主线程(也称为调用栈)和任务队列(Event Queue)组成,这两个组件协同工作以确保同步和异步任务的有序执行。文章结尾附上真题解析
同步任务指的是任务按照程序中的顺序,一个接一个地执行,并且当前任务必须等待前一个任务完成后才能开始。在同步执行中,程序的执行流程是线性的,每个操作都必须等待前一个操作完成后才能进行。
console.log('Step 1');
let result = add(2, 3);
console.log(result);
console.log('Step 2');
function add(a, b) {
return a + b;
}
在上面的例子中,console.log(‘Step 1’) 执行完毕后才会执行函数调用 add(2, 3),并等待 add 函数返回结果后才会继续执行后续代码。
异步任务则允许程序在等待某些操作完成时继续执行其他任务。这意味着可以启动一个任务,然后程序继续执行,而不需要等待该任务完成。当异步任务完成时,通常会通过回调函数、事件、或者Promise等方式通知程序。包括:
console.log('Start');
setTimeout(() => {
console.log('Timeout callback');
}, 1000);
console.log('End');
在上述例子中,setTimeout 是一个异步任务,它会在1秒后将回调函数推入任务队列,而主线程不会等待这个1秒,而是继续执行后面的 console.log(‘End’)。当主线程的同步任务执行完成后,它会检查任务队列,将异步任务的回调函数推入执行栈,最终输出 ‘Timeout callback’。
任务队列分为宏任务队列(macrotask queue)和微任务队列(microtask queue)两种。JavaScript 引擎遵循事件循环的机制,在执行完当前宏任务后,会检查微任务队列,执行其中的微任务,然后再取下一个宏任务执行。这个过程不断循环,形成事件循环。
1、宏任务包括:
2、微任务包括:
Node.js的事件循环比浏览器中的复杂,因为它需要处理I/O操作、网络请求等。Node.js的事件循环由以下几个阶段组成:
Node.js的事件循环机制在不同版本中有所变化。例如:
console.log('script start') async function async1() { await async2() console.log('async1 end') } async function async2() { console.log('async2 end') } async1() setTimeout(function() { console.log('setTimeout') }, 0) new Promise(resolve => { console.log('Promise') resolve() }) .then(function() { console.log('promise1') }) .then(function() { console.log('promise2') }) console.log('script end') // 旧版输出如下,但是请继续看完本文下面的注意那里,新版有改动 // script start => async2 end => Promise => script end => promise1 => promise2 => async1 end => setTimeout
分析这段代码:
let promise_ = new Promise((resolve,reject){ resolve(undefined)})
执行完成,执行await后面的语句,输出async1 end
最后,执行下一个宏任务,即执行setTimeout,输出setTimeout
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。