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最后输出。

  • 相关阅读:
    css 正方体
    鼠标放上去,不同的cursor光标类型
    文件上传用到的函数 20150205
    PHP常用正则表达式汇总
    代码练习之 登陆 PHP会话控制 session cookie
    正则表达式全部符号解释
    字典转模型
    Day11 TableView
    Day10
    Day9
  • 原文地址:https://www.cnblogs.com/web-chuanfa/p/11147232.html
Copyright © 2011-2022 走看看