1、setTimeout()
单线程运行机制,同一时间只能做一件事。
无论怎样,都是要等主线线程的流程执行完毕后才会进行,且按照setTimeout设置的顺序进行排队执行。
不考虑setTimeout的位置顺序,总是要等主线程执行完毕后,才运行。
setTimeout的第二个参数时间是相对的,如果说,主线程的运行时间,超过了这个时间,在执行setTimeout的时候,会忽略这个时间,直接进行执行。
setTimeout(() => {
console.log('=====setTimeout 1')
}, 0)
console.log(1)
setTimeout(() => {
// 此时执行大量的计算,会阻塞在当前的setTimeout回调函数中,等完成后,执行下一个setTimeout。
for (let i = 0; i < 10000000000; i++) {
}
console.log('=====setTimeout 2')
}, 0)
console.log(2)
setTimeout(() => {
console.log('=====setTimeout 3')
}, 0)
console.log(3)
结果:
1
2
3
=====setTimeout 1
=====setTimeout 2
=====setTimeout 3
2、 process.nextTick()
nodeJs的一个异步执行函数,效率比setTimeout(fn, 0)更高,执行顺序要早与setTimeout,在主逻辑的末尾任务队列调用之前执行。
主线程----》 nextTick -----》setTimeout
console.log(1)
setTimeout(() => {
console.log('=====setTimeout 1')
})
process.nextTick(() => {
console.log('=====nextTick 1')
})
console.log(2)
setTimeout(() => {
console.log('=====setTimeout 2')
})
process.nextTick(() => {
console.log('=====nextTick 2')
})
console.log(3)
结果:
1
2
3
=====nextTick 1
=====nextTick 2
=====setTimeout 1
=====setTimeout 2
3、setInterval()
setInterval()定时器函数,按照指定的周期不断调用函数或计算表达式。
等待主线程完成后调用。
timeout时间一致时,按照setInterval设置的顺序来执行。
console.log(1)
setInterval(() => {
consoel.log('=====setInterval 1 before')
for (let i = 0; i < 10000000000; i++) {
}
consoel.log('=====setInterval 1 after')
}, 1000)
setInterval(() => {
consoel.log('=====setInterval 2')
}, 1000)
console.log(2)
结果:
1
2
=====setInterval 1 before
=====setInterval 1 after
=====setInterval 2