美文网首页前端知识点
同步、异步、回调执行顺序

同步、异步、回调执行顺序

作者: AMONTOP | 来源:发表于2019-01-11 16:29 被阅读63次

    看下面例子判断输出的值

    let a = new Promise(  
      function(resolve, reject) {  
        console.log(1)  
        setTimeout(() => console.log(2), 0)  
        console.log(3)  
        console.log(4)  
        resolve(true)  
      }  
    )  
    a.then(v => {  
      console.log(8)  
    })  
      
    let b = new Promise(  
      function() {  
        console.log(5)  
        setTimeout(() => console.log(6), 0)  
      }  
    )  
      
    console.log(7)  
    

    在看正确结果之前,我先进行分析题目(同步 => 异步 => 回调):

    • 1).看同步代码:a变量是一个Promise,一开始大家都会以为Promise不是异步吗?不不,其实Promise是异步的,是指他的then()和catch()方法,Promise本身还是同步的,所以这里先执行a变量内部的Promise同步代码。(同步优先)
       console.log(1)
       setTimeout(() => console.log(2), 0) //回调
       console.log(3)
       console.log(4)
    
    • 2).Promise内部有4个console,第二个是一个setTimeout回调(回调垫底,所以暂时不输出)。所以这里先输出1,3,4,回调的方法丢到消息队列中排队等着。
    • 3)接着执行resolve(true),进入then(),then是异步,下面还有同步没执行完呢,所以then也去消息队列排队等候。(异步靠边)
    • 4)b变量也是一个Promise,和a一样,同样是同步的,执行内部的同步代码,输出5,setTimeout是回调,去消息队列排队等候,这里输出5。
    • 5)最下面同步输出7。
    • 6)现在同步的代码执行完了,JavaScript就跑去消息队列呼叫异步的代码:异步,出来执行了。这里只有一个异步then,所以输出8。
    • 7)此时,异步也over,轮到回调函数:回调,出来执行了。这里有2个回调在排队,他们的时间都设置为0,所以不受时间影响,只跟排队先后顺序有关。则先输出a里面的回调2,最后输出b里面的回调6。
    • 8)最终输出结果就是:1、3、4、5、7、8、2、6。

    相关文章

      网友评论

        本文标题:同步、异步、回调执行顺序

        本文链接:https://www.haomeiwen.com/subject/xxwxdqtx.html