mdn官网:developer.mozilla.org/zh-CN/docs/…
该特性是非标准的,请尽量不要在生产环境中使用它!
定义
该方法用来把一些需要长时间运行的操作放在一个回调函数里,在浏览器完成后面的其他语句后,就立刻执行这个回调函数。
setImmediate参数设置
- 第一个参数是需要执行的方法,
- 第二个参数到第n个参数是传入方法中的参数。
function func(...data) {
console.log(data)
}
setImmediate(func, 111,222)
setImmediate
表示立即执行,它是宏任务,回调函数会被放置到事件循环的check
阶段。因为代码在这一个阶段执行不会阻塞主线程,也不会阻塞事件循环。
setImmediation非阻塞举例
例子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')
输出结果:
先打印出start
,然后等待2000ms
后再打印ok
和end
。
例子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
,然后再打印end
,最后等待2000ms
后打印end
。
出现这种情况的原因是:setImmediate
将其中的函数作为宏任务,放到C++
一个线程中去执行,然后将其放入任务队列中。所以不会影响主线程的执行。
window.clearImmediate 方法可以用来取消通过setImmediate设置的将要执行的语句, 就像 window.clearTimeout 对应于 window.setTimeout一样.
区别于setTimeout
setTimeout
setTimeout(setInterval与setTimeout函数区别只是执行次数)函数,需要注意的是,setTimeout只是将事件插入了“任务队列”,必须等到当前代码(执行栈)执行完,主线程才会去执行它指定的回调函数。要是当前代码耗时很长,有可能要等很久,所以没办法保证,回调函数一定会在setTimeout()指定的时间执行。
setImmediate
setImmediate()是将事件插入到事件队列尾部,主线程和事件队列函数执行完之后立即执行setImmediate指定的回调函数,和setTimeout(fn,0)效果差不多。但是当他们在同一个事件循环中,执行顺序是不定的。
在setTimeout和setImmediate同时存在的情况下,像上面那样运行顺序是随机的是根据node官网资料The Node.js Event Loop, Timers, and process.nextTick(),