首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

首先发生什么: setTimeout 0还是等待Promise.resolve?

在JavaScript中,setTimeoutPromise.resolve的执行顺序涉及到事件循环(Event Loop)的机制。为了更好地理解这个问题,我们需要先了解一些基础概念。

基础概念

  1. 事件循环(Event Loop)
    • JavaScript是单线程的,但它通过事件循环机制来处理异步操作。
    • 事件循环负责处理任务队列(Task Queue)和微任务队列(Microtask Queue)中的任务。
  • 宏任务(MacroTask)和微任务(MicroTask)
    • 宏任务包括:setTimeoutsetIntervalI/O、UI渲染等。
    • 微任务包括:Promise.thenprocess.nextTick(Node.js)、MutationObserver等。

执行顺序

根据事件循环的机制,微任务会在当前宏任务执行完毕后立即执行,而宏任务则会在下一个事件循环周期开始时执行。

示例代码

代码语言:txt
复制
console.log('Script start');

setTimeout(() => {
  console.log('setTimeout');
}, 0);

Promise.resolve().then(() => {
  console.log('Promise.resolve');
});

console.log('Script end');

输出顺序

  1. Script start
  2. Script end
  3. Promise.resolve
  4. setTimeout

解释

  1. Script startScript end
    • 这两个日志会在脚本开始执行时立即输出。
  • Promise.resolve
    • Promise.resolve会立即执行,并将其回调函数放入微任务队列。
    • 当前宏任务(脚本执行)完成后,事件循环会立即处理微任务队列中的任务,因此Promise.resolve的回调函数会在Script end之后立即执行。
  • setTimeout
    • setTimeout会将回调函数放入宏任务队列,但不会立即执行。
    • 当前宏任务和所有微任务处理完毕后,事件循环才会处理宏任务队列中的任务,因此setTimeout的回调函数会在所有微任务之后执行。

结论

在JavaScript中,Promise.resolve的回调函数会在当前宏任务完成后立即执行,而setTimeout的回调函数会在下一个事件循环周期开始时执行。因此,Promise.resolve会先于setTimeout执行。

参考链接

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

  • Vue之Promise

    ① 同步   当用户使用js和浏览器发生交互时,执行到某一个模块时系统发现需要向服务器提供网络请求,这个时候,js操作就会被阻塞,然后浏览器向服务器发送网络请求。   我们都知道网络请求的速度会比较慢,在此期间,不管用户执行任何操作,浏览器都不会去执行,因为此时的浏览器正在向服务器发送请求,没有空去理会别的操作,这就是同步,简单可以理解成浏览器的执行是按照某中顺序执行的,只有等上一步完成之后才会继续执行下一步操作。 ② 异步   异步的含义和同步恰恰相反。当用户和浏览器发生交互,执行到某一模块的时候发现需要向服务器发送网络请求时,这个时候,浏览器向服务器发送请求之后,仍然可以执行别的操作。   当浏览器向服务器发送的请求得到回应后,我们一般会声明一个函数,将请求的结果放到该函数中,用户执行完某些操作后再回调该函数就可以得到向服务器发送网络请求的数据。   这就是异步,简单的可以理解成一心二用:**一边向服务器发送请求,一边执行相关的操作,最后通过回调某个函数来得到向服务器发动请求的数据。**如果只是一个简单的网络请求,这种方案没有什么麻烦,但是当网络请求变得复杂的时候,就会出现回调地狱 。

    02
    领券