process.nextTick

221 阅读1分钟

参考:www.jianshu.com/p/5328c7227…

基于Node环境的

process.nextTick这个名字有点误导,它是在本轮循环执行的,而且是所有异步任务里面最快执行的。

Node 执行完所有同步任务,接下来就会执行process.nextTick的任务队列。所以,下面这行代码是第二个输出结果。

基本上,如果你希望异步任务尽可能快地执行,那就使用process.nextTick

语法

process.nextTick(callback[, ...args])
  • callback 回调函数
  • args 调用callback时额外传的参数

执行顺序

Promise对象的回调函数,会进入异步任务里面的"微任务"(microtask)队列。
微任务队列追加在process.nextTick队列的后面,也属于本轮循环。所以,下面的代码总是先输出3,再输出4。

process.nextTick()可用于赋予用户一种能力,去保证方法在对象完成constructor后但是在I/O发生前调用。

process.nextTick(() => console.log(3));Promise.resolve().then(() => console.log(4));// 3// 4

process.nextTick()知识点

  • process.nextTick()会将callback添加到”next tick queue“

  • next tick queue会在当前JavaScript stack执行完成后,下一次event loop开始执行前按照FIFO出队

  • 如果递归调用process.nextTick()可能会导致一个无限循环,需要去适时终止递归。

  • process.nextTick()可用于控制代码执行顺序。保证方法在对象完成constructor后但是在I/O发生前调用。

  • process.nextTick()可完全异步化API。API要么100%同步要么100%异步是很重要的,可以通过process.nextTick()去达到这种保证

process.nextTick()使用示例

  • process.nextTick()对于API的开发很重要

console.log('start');
process.nextTick(() => {
  console.log('nextTick callback');
});
console.log('scheduled');
// start
// scheduled
// nextTick callback

研究的还不够透彻,请高手指教。