一、写在前面
前面一篇博客主要写了关于nexttick的降级问题
,其中牵扯到一个API
,setImmediate
,下面我们将详细了解一下这个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
后再打印ok
和end
。
第二种情况,先打印出start
,然后再打印end
,最后等待2000ms
后打印end
。
出现这种情况的原因是:setImmediate
将其中的函数作为宏任务,放到C++
一个线程中去执行,然后将其放入任务队列中。所以不会影响主线程的执行。
版权说明 : 本文为转载文章, 版权归原作者所有 版权申明
原文链接 : https://blog.csdn.net/weixin_47450807/article/details/124098448
内容来源于网络,如有侵权,请联系作者删除!