2016-02-03 37 views
1

下面的代碼是否可以輸出HERE承諾是懶惰評估?

var p = new Promise(() => console.log("HERE")) 

(也就是說,不var p = new Promise(fn)始終執行fn如果p.then(…)是從來沒有所謂的做一些事情,結果?)

更具體地說,在服務人員的情況下,如果我叫Cache.delete(),但從來沒有打電話.then()關於返回值(或者我扔掉返回值),是否保證刪除緩存條目?

回答

5

是的,它是有保證的。該specification of Promise具有該步驟,這將始終進行評估:。

  • 令完成是調用(執行者,未定義,«resolvingFunctions [[解決],resolvingFunctions [[拒絕] ]»)。
  • 其中executor是你通過什麼樣的Promise構造函數,Call導致代碼正在運行。這一切發生在Promise甚至返回到您的p變量之前。

    +0

    或者簡單地說:傳遞給'Promise'構造函數的executor函數'()=> console.log(「HERE」)總是立即執行。 – ftor

    +0

    @ LUH3417是的,但OP想知道它是否有保證,因此引用和引用規範,說明它在哪裏以及如何被調用,因此_why_它有保證。 –

    +0

    沒有冒犯,只是對不熟悉「spec說話」的用戶 – ftor

    2

    正如詹姆斯說的那樣,保證函數將被調用。雖然這並不能保證緩存條目被刪除!

    您必須檢查承諾分辨率的值(如果緩存條目被刪除,則爲true,否則爲false)。

    +0

    啊好點,那就是......不幸的!我想我可以忍受緩存項目不總是被刪除,雖然我不知道如何處理它可能會頻繁發生的可能性。 – mjs