阅读 62

#node里面的事件环机制

##在浏览器中,全局作用域是window,而在node中是global。

但是我们可以直接var a=1;console.log(window.a),但是我们不能console.log(global.a),因为node在执行的时候会形成一个闭包来实现模块化。 ##Node可以为我们解决什么 Node的首要目标是提供一种简单的,用于创建高性能服务器的开发工具,Web服务器的瓶颈在于并发的用户量,对比Java和Php的实现方式。Node在处理高并发,I/O密集场景有明显的性能优势,高并发,是指在同一时间并发访问服务器。

##非阻塞型I/O及事件环机制

这里每一个阶段都对应一个事件队列,当event loop执行到某个阶段时会将当前阶段对应的队列依次执行。当队列执行完毕或者执行的数量超过上线时,会转入下一个阶段。这里我们重点关注poll阶段

##Node中的Event Loop

首先,我们先get一下宏任务和微任务这两个概念。macro-task(宏任务): setTimeout, setInterval, setImmediate, I/O micro-task(微任务): process.nextTick, 原生Promise(有些实现的promise将then方法放到了宏任务中),Object.observe(已废弃), MutationObserver。可以通过以下这段代码了解它们的执行顺序

  console.log('setTimeout1')
},0)
setTimeout(() => {
  console.log('setTimeout2')
}, 0)
Promise.resolve('p').then(()=>console.log('p'));
// nextTick是队列切换时执行的,timer->check队列 timer1->timer2不叫且
setImmediate(() => {
  console.log('setImmediate1')
  setTimeout(() => {
    console.log('setTimeout1')
  }, 0);
})
setTimeout(()=>{
  process.nextTick(()=>console.log('nextTick'))
  console.log('setTimeout2')
  setImmediate(()=>{
    console.log('setImmediate2')
  })
},0);

// poll的下一个阶段时check
// 有check阶段就会走到check中
let fs = require('fs');
fs.readFile('./1.txt',function () {
  setTimeout(() => {
    console.log('setTimeout')
  }, 0);
  setImmediate(() => {
    console.log('setImmediate')
  });
});

// nextTick不要写递归

function Person(){
  // 让特定的值在下一队列中执行,好处时优先级高于timeout
  process.nextTick(()=> {
    this.arr();
  })
}
Person.prototype.eat = function () {
  this.arr = ()=>{console.log('吃')}
}
let p = new Person();
p.eat();```

复制代码
文章分类
前端