最新公告
  • 欢迎您光临起源地模板网,本站秉承服务宗旨 履行“站长”责任,销售只是起点 服务永无止境!立即加入钻石VIP
  • Eventloop

    正文概述 掘金(EmmaLee)   2021-03-03   591

    主线程从"任务队列"中读取事件,这个过程是循环不断的,所以整个的这种运行机制又称为Event Loop(事件循环)。

    浏览器下js的事件循环机制

    由于存在异步操作的关系,而js又是单线程,所以当遇到一个异步事件的时候,js不会一直等待这个事件,而是把事件放到与当前执行栈不同的队列里面,我们称为事件队列,但是事件队列里面的事件不会先立即执行回调,而是等到栈里面的任务全部执行完,然后主线程回去查看事件队列里面是否有任务,然后把事件队列里面的第一个放到执行栈上面执行同步代码,然后在去取事件队列里面的下一个任务

    由于异步任务不相同,所以他们执行的优先级也不一样,不同的异步任务被分为两类:微任务(micro task)和宏任务(macro task)。 其中,微任务有:new Promise()[await需要将其转换成promise],new MutaionObserver(),宏任务有:setInterval(),setTimeout()

    setTimeout(function () {
       console.log(4);
    }, 0);
    new Promise(function (resolve) {
       console.log(1);
       resolve();
       console.log(2);
    }).then(function () {
       console.log(5);
    });
    
    console.log(3);
    

    首先从上往下执行,setTimeout会被先被放到宏任务中,然后执行new Promise,new Promise内部的函数除非执行到resolve(),不然都是同步的,所以会先打印1和2,然后把resolve()放到微任务中,然后打印3,接下来会先执行微任务,所以先打印5,然后执行宏任务,打印4,所以结果是1,2,3,5,4

    Eventloop 注意如果有await那么他后面的全部转化到resolve里面

     async function async1() {
         console.log(1);
         await async2();
         console.log(2);
     }
     async function async2() {
         console.log(3)
     }
    
     async1();
    
     new Promise(function (resolve) {
         console.log(4);
         resolve();
     }).then(function () {
         console.log(5);
     });
    

    这道题首先执行async1()->打印1->await async2();console.log(2) 转化微 promise.resolve(async2()).then(console.log(2))->打印3->执行new Promise->打印4->执行console.log(2)->打印2->打印5

    Eventloop

    nodejs的事件循环机制

    node中的事件循环存在于libuv引擎中 Eventloop 顺序为:外部输入数据-->轮询阶段(poll)[或从timers进入]-->检查阶段(check)-->关闭事件回调阶段(close callback)-->定时器检测阶段(timer)-->I/O事件回调阶段(I/O callbacks)-->闲置阶段(idle, prepare)-->轮询阶段..

    其中在timers这个阶段执行的回调函数有setInterval()setTimeout()

    在check这个阶段的有setImmediate()

    process.nextTick()是在每一个阶段快要执行完进入下一个阶段开始前执行的

    setTimeout(() => {
        console.log('timeout');
    }, 0);
    
    setImmediate(() => {
        console.log('immediate');
    });
    

    但是若想判断setTimeout和setImmediate谁先执行,这个答案是不一定,因为随着进如的时机不同,有可能会从timers进入或从poll进入,那么这两个谁先谁后就不太好说了,但是如果在他们的外面加上一个回调函数

    setTimeout(()=>{
    setTimeout(() => {
        console.log('timeout');
    }, 0);
    
    setImmediate(() => {
        console.log('immediate');
    });
    },0)
    

    那么就一定是setImmediate->setTimeout


    起源地下载网 » Eventloop

    常见问题FAQ

    免费下载或者VIP会员专享资源能否直接商用?
    本站所有资源版权均属于原作者所有,这里所提供资源均只能用于参考学习用,请勿直接商用。若由于商用引起版权纠纷,一切责任均由使用者承担。更多说明请参考 VIP介绍。
    提示下载完但解压或打开不了?
    最常见的情况是下载不完整: 可对比下载完压缩包的与网盘上的容量,若小于网盘提示的容量则是这个原因。这是浏览器下载的bug,建议用百度网盘软件或迅雷下载。若排除这种情况,可在对应资源底部留言,或 联络我们.。
    找不到素材资源介绍文章里的示例图片?
    对于PPT,KEY,Mockups,APP,网页模版等类型的素材,文章内用于介绍的图片通常并不包含在对应可供下载素材包内。这些相关商业图片需另外购买,且本站不负责(也没有办法)找到出处。 同样地一些字体文件也是这种情况,但部分素材会在素材包内有一份字体下载链接清单。
    模板不会安装或需要功能定制以及二次开发?
    请QQ联系我们

    发表评论

    还没有评论,快来抢沙发吧!

    如需帝国cms功能定制以及二次开发请联系我们

    联系作者

    请选择支付方式

    ×
    迅虎支付宝
    迅虎微信
    支付宝当面付
    余额支付
    ×
    微信扫码支付 0 元