setImmediate方法

x33g5p2x  于2022-04-12 转载在 其他  
字(0.9k)|赞(0)|评价(0)|浏览(517)

一、写在前面
前面一篇博客主要写了关于nexttick的降级问题,其中牵扯到一个APIsetImmediate,下面我们将详细了解一下这个API
二、setImmediate方法
setImmediate参数设置:第一个参数是需要执行的方法,第二个参数到第n个参数是传入方法中的参数。

function func(...data) {
  console.log(data)
}
setImmediate(func, 111,222)

setImmediate表示立即执行,它是宏任务,回调函数会被放置到事件循环的check阶段。
在应用中如果大量的计算型任务,它是不适合放在主线程中执行的,因为计算任务会阻塞主线程,主线程一旦被阻塞,其他任务就需要等待,所以这种类型的任务最好交给C++维护线程去执行。
可以通过setImmediate方法将任务放入事件循环中的check阶段,因为代码在这一个阶段执行不会阻塞主线程,也不会阻塞事件循环。
2.1、例子一

function sleep(delay) {
  var start = new Date().getTime()
  while (new Date().getTime() - start < delay) {
    continue
  }
  console.log('ok')
}

console.log('start')
sleep(2000)
console.log('end')

2.2、例子二

function sleep(delay) {
  var start = new Date().getTime()
  while (new Date().getTime() - start < delay) {
    continue
  }
  console.log('ok')
}

console.log('start')
setImmediate(sleep, 2000)
console.log('end')

第一种情况,先打印出start,然后等待2000ms后再打印okend
第二种情况,先打印出start,然后再打印end,最后等待2000ms后打印end
出现这种情况的原因是:setImmediate将其中的函数作为宏任务,放到C++一个线程中去执行,然后将其放入任务队列中。所以不会影响主线程的执行。

相关文章