2017-07-25 42 views
4

是否有可能在承諾解決方案和承諾之間執行用戶代碼等待返回?JavaScript ES6 - 承諾解決和事件之間可能的競爭狀態?

function a() { 
    return new Promise(resolve => { 
    setTimeout(() => { 
     // Between here... 
     resolve() 
    }, 1000)) 
    } 
} 

async function b() { 
    await a() 
    // ...and here ? 
} 

規範是否強制立即調用Promise回調?我想知道兩點之間的虛擬機是否可以處理事件,可能會引起副作用。

+0

當然,這就是*異步*的含義。其他事件可能發生在事件之間。 – deceze

+0

非*事件*,但其他承諾回調可能會在那裏運行。 – Bergi

+1

@deceze我明白,當b正在等待a時,任何事情都可能發生,但我的問題是關於承諾解析和回調調用之間的具體問題。 – Yovar

回答

4

不,它不強制立即調用。 The spec貫穿若干在解決一個承諾,其中之一是如下步驟:

  • 執行EnqueueJob( 「PromiseJobs」,PromiseResolveThenableJob,«承諾,分辨率,thenAction»)
  • 請注意,根據承諾的狀態,可以採取不同的路線。然而,它們都end at EnqueueJob,其表示:

  • 添加在作業隊列的由QUEUENAME命名背面懸而未決。
  • 因此,任何進一步的執行被推遲到作業隊列的末尾。

    1

    Promise回調函數是而不是立即調用。你的功能b()轉變爲其中在某個時間點由事件循環a的承諾得到解決後,執行這是考慮到then功能

    function b() { 
        return a().then(() => { 
        // Do something 
        }); 
    } 
    

    。它永遠不會被同步調用,因爲規範保證Promise延續總是以空的調用堆棧運行(這意味着在事件循環的新迭代中)。因此,一些其他代碼(例如來自其他承諾解決方案)可以在承諾解決的時間和延續運行的時間之間運行。