在 j**ascript 中,macro-task 和 micro-task 指的是两种类型的异步操作。
宏任务通常包括以下操作:
SetTimeout 和 SetInterval TimersFunction EventsFunctions(例如,鼠标单击、键盘输入等)AJAX 请求的函数AnimationFramesFunction 脚本标记OnLoad 和 OnError 事件当宏任务开始执行时,j**Ascript 引擎将其放在调用堆栈的底部,然后转到其他任务。当调用堆栈为空时,j**ascript 引擎将执行下一个宏任务并执行它。
微任务通常包括以下操作:
Promise 的功能:生成器、突变观察器和过程nexttick(node.JS)当微任务添加到任务队列时,它会在当前宏任务执行后立即执行,而不是等待下一个宏任务开始执行。这允许微任务在执行当前宏任务期间处理异步操作的结果,从而提高应用程序的响应能力。
在 j**ascript 中,宏任务和微任务具有不同的执行优先级。 通常,微任务优先于宏任务,也就是说,在宏任务中,如果存在微任务,那么微任务将优先于宏任务执行。
具体来说,当一个宏任务开始执行时,如果在执行过程中产生了微任务,这些微任务会被添加到微任务队列中,等待执行完成后立即执行当前的宏任务。 如果在进程中生成了新的微任务,则执行该微任务,直到微任务队列为空,然后 j**ascript 引擎将转到下一个宏任务。
例如,下面演示了宏任务和微任务的执行顺序:
console.log('start');settimeout(function() 0);promise.resolve().then(function() console.log('end');在上面,首先执行同步log('start') 和控制台log('end')。接下来,使用 settimeout 添加宏任务,然后使用 promiseresolve().然后添加一个微任务。 由于微任务优先于宏任务,因此 promise 的函数在 settimeout 函数之前执行。 因此,上述**的输出顺序如下:
startendpromisesettimeout