zoukankan      html  css  js  c++  java
  • 真实环境中执行顺序的举例

    (1) setTimeout和promise

    例3:
    
    setTimeout(function () {
      console.log(3);
    }, 0);
    
    Promise.resolve().then(function () {
      console.log(2);
    });
    
    console.log(1);
    
    

    我们先以第1小节的例子为例,这里遵循的顺序为:

    script(主程序代码)——>promise——>setTimeout
    对应的输出依次为:1 ——>2————>3

    (2) process.nextTick和promise、setTimeout

    例子4:
    setTimeout(function(){console.log(1)},0);
    
    new Promise(function(resolve,reject){
       console.log(2);
       resolve();
    }).then(function(){console.log(3)
    }).then(function(){console.log(4)});
    
    process.nextTick(function(){console.log(5)});
    
    console.log(6);
    //输出2,6,5,3,4,1
    

    这个例子就比较复杂了,这里要注意的一点在定义promise的时候,promise构造部分是同步执行的,这样问题就迎刃而解了。

    首先分析Job queue的执行顺序:

    script(主程序代码)——>process.nextTick——>promise——>setTimeout

    I) 主体部分: 定义promise的构造部分是同步的,
    因此先输出2 ,主体部分再输出6(同步情况下,就是严格按照定义的先后顺序)

    II)process.nextTick: 输出5

    III)promise: 这里的promise部分,严格的说其实是promise.then部分,输出的是3,4

    IV) setTimeout : 最后输出1

    综合的执行顺序就是: 2——>6——>5——>3——>4——>1

    (3)更复杂的例子

    setTimeout(function(){console.log(1)},0);
    
    new Promise(function(resolve,reject){
       console.log(2);
       setTimeout(function(){resolve()},0)
    }).then(function(){console.log(3)
    }).then(function(){console.log(4)});
    
    process.nextTick(function(){console.log(5)});
    
    console.log(6);
    
    //输出的是  2 6 5 1 3 4
    

    这种情况跟我们(2)中的例子,区别在于promise的构造中,没有同步的resolve,因此promise.then在当前的执行队列中是不存在的,只有promise从pending转移到resolve,才会有then方法,而这个resolve是在一个setTimout时间中完成的,因此3,4最后输出。

  • 相关阅读:
    sqlalchemy 查询姿势总结
    sqlalchemy 常用总结
    rsyslog 移植与配置方案介绍
    软件设计随想录
    C语言面对对象设计模式汇编
    关于linux kernel slab内存管理的一点思考
    linux PMBus总线及设备驱动分析
    Linux x86_64 APIC中断路由机制分析
    单板控制领域模型设计与实现
    Linux mips64r2 PCI中断路由机制分析
  • 原文地址:https://www.cnblogs.com/web-chuanfa/p/11147232.html
Copyright © 2011-2022 走看看