在线观看不卡亚洲电影_亚洲妓女99综合网_91青青青亚洲娱乐在线观看_日韩无码高清综合久久

鍍金池/ 問答/HTML/ Promise的then方法中的回調函數(shù)和setTimeout執(zhí)行順序問題

Promise的then方法中的回調函數(shù)和setTimeout執(zhí)行順序問題

  setTimeout(function(){
        console.log('D');
    },0)

    var promise = new Promise(function(resolve, reject){
        console.log('A');
        resolve('C');
    })

    console.log('B');
    
      promise.then(function(value){
        console.log(value)
    });
    
    這段代碼AB先打印我沒問題,就是不理解為什么是C先于D打印,按理說應該是setTimeout先把回調放進任務隊列里面等待執(zhí)行吧
回答
編輯回答
綰青絲

因為有倆個隊列.

一個是 microtask 隊列, 一個 macrotask 隊列.

promise 是放入 microtask 隊列的, 而 setTimeout 放入 macrotask 隊列.

先處理 microtask 隊列, microtask 隊列每次處理直到隊列為空, 接下來處理 macrotask 隊列, macrotask 每次只處理的隊列里的第一個任務, 當任務處理完后, 又會進入到 microtask 隊列的處理. 如此反復.

2018年7月2日 08:27
編輯回答
純妹

這個很好理解,根本在于明確理解異步問題。

首先關于setTimeout你的理解沒錯,是一個隊列執(zhí)行,這里類似于setTimeout的還有很多,比如node中的:
setImmediate, process.nextTick等,都是類似機制。
這些函數(shù)都是延時執(zhí)行,顧名思義就是要放進隊列排隊的,哪怕設置了延時0.

但是 Promise是什么呢
簡單說,不過是 一種 異步編程的解決方案,說白了是改變之前 回調函數(shù)寫法的 問題。Promise,簡單說就是一個容器,里面保存著某個未來才會結束的事件(通常是一個異步操作)的結果。而這個存儲的隊列是promsie本身維護的自己的隊列,千萬不要和setTimeout的系統(tǒng)事件調度隊列混淆。

針對你的這個問題,你這個promise沒有異步,所以promsie的狀態(tài)馬上就變成了 resolve的,所以呢,通過then注冊的回調函數(shù)馬上就會調用。基本是就是同步執(zhí)行而已。當然比setTimeout先執(zhí)行。

2017年6月8日 03:00
編輯回答
野橘

這里涉及到異步的宏任務和微任務,setTimeout是宏任務,Promise整體是微任務,主線程執(zhí)行完了之后先從微任務棧里面獲取微任務執(zhí)行,沒有微任務了,就去宏任務棧里面獲取宏任務執(zhí)行,所以在一個循環(huán)內,微任務是比宏任務先執(zhí)行的,所以先打印C再打印D

2018年3月6日 12:18