zoukankan      html  css  js  c++  java
  • 3、异步编程-JS种事件队列的优先级

    一、任务队列 > 事件循环(onclick、settimeout)之上

    在JS中ES6 中新增的任务队列(promise)是在事件循环(onclick、settimeout、ajax)之上的,事件循环每次 tick 后会查看 ES6 的任务队列中是否有任务要执行,也就是 ES6 的任务队列比事件循环中的任务(事件)队列优先级更高。

    如 Promise 就使用了 ES6 的任务队列特性。也即在执行完任务栈后首先执行的是任务队列中的promise任务。其他的上面常见的异步操作加入队列的时间没有相应的优先级

    setTimeout(function(){console.log('111')},0);
    new Promise(function(resolve,reject){
       console.log("2222");//此处还没有执行异步操作,执行异步操作及执行回调函数,在promise中即then中的回调
      resolve();
    }).then(function(){console.log('3333')})
    console.log("44444");
    //输出
    // 2222
    // 44444//上面的两个输出属于同步操作
    // 3333//promise加入到队列的优先级高于setTimeout
    //111

    注:

    1)、onclick 由浏览器内核的 DOM Binding 模块来处理,当事件触发的时候,回调函数会立即添加到任务队列中。
    2)、setTimeout 会由浏览器内核的 timer 模块来进行延时处理,当时间到达的时候,才会将回调函数添加到任务队列中。 3)、ajax 则会由浏览器内核的 network 模块来处理,在网络请求完成返回之后,才将回调添加到任务队列中。

    二、同时在嵌套异步操作中,会将嵌套的异步加入到下次的任务队列中,以此类推(如嵌套的promise)

    new Promise(function(resolve,reject){
      resolve();
    }).then(function(){
        console.log("111");
        return new Promise(function(resolve,reject){
       resolve();
    })
    }).then(function(){ console.log("222");})
    
    new Promise( function(resolve,reject){
        resolve();
    }).then(function(){ console.log("33333");})
    //输出
    111 33333 222
    

      

  • 相关阅读:
    EventDemo——演示事件流
    数组的深复制和浅复制
    Loader类和LoaderInfo类
    几个不同颜色方框——事件流
    自定义事件类的方法——实现接口
    [转帖]ModelSim+Synplify+Quartus的Altera FPGA的仿真与验证
    [转帖]2011年最新企业offer(待遇)比较
    [转帖]引用 利用ModelSim进行的功能仿真,综合后仿真,时序仿真
    [转帖]VHDL中Configuration
    [转帖]ModelSim+Debussy仿真(Verilog)
  • 原文地址:https://www.cnblogs.com/daji/p/9524507.html
Copyright © 2011-2022 走看看