node事件循环

2021-04-18  本文已影响0人  努力学习的小丸子

浏览器事件循环见:https://www.jianshu.com/p/64bbefbe5ae5
参考:http://lynnelv.github.io/js-event-loop-nodejs
nodejs中的eventloop 和 浏览器中的eventloop 不一样。

node事件循环图例:

https://nodejs.org/en/docs/guides/event-loop-timers-and-nexttick/

image.png

各阶段解释:

 trigger(topic,params){
 if(!this.eventMap[topic]){
 return;
 }
 this.eventMap[topic].forEach(item=>{
 // cb();
 item.cb && setImmediate(()=>{item.cb(params)})
 })
 }

node 微任务执行时机:六个阶段中的任意阶段执行完成,都会执行微任务队列中的任务

image.png

例子:

//第一个事件循环,timers中执行
setTimeout(()=>{
    console.log('timer1')
   // 此处是第二个事件循环,同样是在timers阶段执行
    setTimeout(function(){
        console.log(11111)
        Promise.resolve().then(function() {
            console.log('222')
        })
    },0)

    Promise.resolve().then(function() {
        console.log('promise1')
    })
}, 0)
//第一个事件循环,timers中执行
setTimeout(()=>{
    console.log('timer2')

    Promise.resolve().then(function() {
        console.log('promise2')
    })
}, 0)

执行结果:


image.png

理解node 事件循环

 function checkFund(){
    if(Math.random()<.5){
        return {msg:'success'}
    }else{
        throw new Error('error');
    }
 }
// 可以捕捉到error,因为处于一个事件循环中
 try{
     for(let i=0;i<10;i++){
         checkFund();
     }
 }catch(e){
     console.log('catch,',e);
 }

当使用异步

 function checkFund(){
     setTimeout(()=>{
        if(Math.random()<.5){
            return {msg:'success'}
        }else{
            throw new Error('error');
        }
     })
 }
// 无法捕捉到error,因为处于不同的事件循环中,此时会将error抛到全局,非常不安全
 try{
     for(let i=0;i<10;i++){
         checkFund();
     }
 }catch(e){
     console.log('catch,',e);
 }

node官方推荐的error-first回调


 function checkFund(cb){
    if(Math.random()<.5){
        cb(null,{msg:'success'})
    }else{
        cb(new Error('error'))
    }
 }
 for(let i=0;i<10;i++){
    checkFund((err,res)=>{
        if(err){
            console.log('err')
        }
    })
 }
上一篇下一篇

猜你喜欢

热点阅读