2017-06-28 119 views
3

在將Chrome升級到58之前,我沒有任何錯誤。Promise意外的行爲,執行順序

進一步說明:我的代碼是工作在週日,我是不知道的執行的異步性質,發現了這兩天後!

new Promise((s, f) => { 
    console.log(1); 
    s(); 
    console.log(2); 
}) 
.then(r => {console.log(3)}) 

console.log(4); 

OUTPUT:


1-爲什麼'then'在console.log(2)之後被執行?

可能的答案:因爲承諾結果被人體後,執行返回

2 - 爲什麼「然後」得到的console.log(4)後執行???

+3

承諾不應該是同步的。想象一下,解析器/拒絕器是'setTimeout(function(){...})',你會得到基本相同的行爲。 –

+0

我對我所有的測試瀏覽器(firefox/chrome/edge/opera)都有相同的順序。對於我不知道的第一個問題,但看起來像3是在4之後出現的邏輯,就像在常規的異步調用中一樣,接下來的代碼在回調之前執行。 – Kaddath

+0

@PatrickRoberts對,但我的代碼在週日工作,我沒有意識到執行中的異步本質,今天發現了這個有趣的事情! –

回答

1

由於承諾的異步性質,then處理程序將存儲在事件循環的消息隊列中。只要JavaScript運行時的調用堆棧爲空,就會處理此隊列的元素。在你的場景中,console.log(4);需要在封裝函數從調用堆棧中取出之前運行,此時JavaScript引擎可以開始處理來自消息隊列的項目(假設封閉函數是頂層函數),導致運行then中的代碼。