定时器与代码执行次序

1、常见的定时器

  • setTimeOut
  • setInterval
  • setImmediate (Node特有)
  • process.nextTick(Node特有)

以及在代码执行次序的面试题中常出现的 Promise 对象。

2、代码执行次序

  首先,任务分为同步任务 和 异步任务,并且同步任务 总是早于 异步任务执行
  其次,异步任务分为追加在本轮循环的异步任务 和 追加在次轮循环的异步任务,并且追加在本轮循环的异步任务 总是早于 追加在次轮循环的异步任务执行

2.1 常见定时器回调执行时机
  • process.nextTick的回调函数 —— 异步任务,追加在本轮循环
  • setTimeOut的回调函数 —— 异步任务,追加在次轮循环
  • setInterval的回调函数 —— 异步任务,追加在次轮循环
  • setImmediate的回调函数 —— 异步任务,追加在次轮循环

(1)process.nextTick()
  该方法的回调是在本轮循环中执行,且是所有异步任务里面最先执行的,即执行完同步就开始执行 process.nextTick 的任务队列。

(2)setTimeOut() 在 timers 阶段执行。

(3)setImmediate() check 阶段执行。

注意:原则上 timers 阶段在 check 阶段之前,

setTimeout(() => console.log(1));
setImmediate(() => console.log(2));

故,上述代码中,setTimeOut 会早于 setImmediate,即先输出 1 后输出 2。但在实际执行的时候,有可能先输出 2 后输出 1。
  这是因为在Node中 setTimeout 的第二个参数默认为0。但是实际上,Node 做不到0毫秒,最少也需要1毫秒,也就是说,setTimeout(f, 0) 等同于 setTimeout(f, 1)。实际执行的时候,进入事件循环以后,有可能到了1毫秒,也可能还没到1毫秒,取决于系统当时的状况。如果没到1毫秒,那么 timers 阶段就会跳过,进入 check 阶段,先执行setImmediate的回调函数。

2.2 Promise对象各种回调执行时机

(1)新建Promise对象
  Promise新建后就会立即执行,即

new Promise(callback)

当代码执行到该行时,callback将立即执行。其中 callback 中调用 resolvereject 并不会终结 callback 的执行,即 resolvereject 的后续代码依然会执行。

(2)Promise.prototype.then() 和 Promise.prototype.catch() 方法
  resolvereject 的Promise会被追加在本轮循环,即

new Promise(callback).then/catch

thencatch 中的代码将在本轮循环的末尾执行,先于次轮循环。

(3)Promise.resolve()
  该方法参数可以分为四种情况,但都遵循上述两种执行次序。

3、事件循环的六个阶段

  • timers
  • I/O callbacks
  • idle, prepare
  • poll
  • check
  • close callbacks

4、示例

setTimeout(() => console.log(1));
setImmediate(() => console.log(2));
process.nextTick(() => console.log(3));
new Promise((res, rej) => {console.log(4);res()}).then(() => console.log(5))
Promise.resolve().then(() => console.log(6));
(() => console.log(7))();

运行结果:

4 7 3 5 6 1 2
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值