2 回答

TA貢獻1853條經驗 獲得超6個贊
那么術語“可以”和“承諾”之間有什么區別?
我認為您已經引用的部分確實很好地回答了這個問題:
一個是一個帶有
then
方法的對象。任何對象。promise是一個具有符合規范的
then
方法(即,thenable)的對象。
到目前為止這么簡單。我認為你的實際問題是:“ 為什么他們會被區分? ”
問題在于,通過查看對象,您無法確定它是否是一個承諾。
您可能會告訴它這是一個承諾,因為您可以看到它的then
方法是由您自己或您信任的人實現的 - 通常是您選擇的承諾庫。您將能夠“看到”因為對象確實從您的promise原型繼承,或者您甚至可以比較與您定義的函數相同的(引用)方法?;蛉魏纹渌阋詽M足您的檢查方法。
您可能會告訴它它不是一個承諾,因為它沒有then
方法。
但是你如何處理一個實現的對象then
,但不知道是一個承諾?這是一個很好的,并將按此處理。
Promises / A +規范旨在實現promise實現之間的互操作性,并使用鴨子類型的.then()
方法的存在。它確實指定了一個關于如何處理這樣的可能性(可能是承諾或至少具有類似行為)的精確算法,以便您可以從它們創建實際的,可信的(“已知”)承諾。
為什么在2個開始和結束括號內表示?有沒有約定?
是的,ECMAScript規范將此語法用于內部方法和屬性:
內部屬性的名稱用雙方括號[[]]括起來。
這些屬性實際上并不需要存在,它們純粹用于描述應該發生的事情 - 實現必須像使用它們一樣。但它們完全是抽象的操作。

TA貢獻1853條經驗 獲得超9個贊
這是一個聰明的嘗試,使promises更容易在不同的庫之間互操作。
該規范thenable僅在少數幾個地方使用該術語。這是最重要的(empasis mine):
promise解析過程是一個抽象操作,它將promise和value作為輸入,我們將其表示為[[Resolve]](promise, x)。如果x是一個可能的,它會嘗試使x采用x的狀態,假設x的行為至少有點像promise。否則,它滿足x值的承諾。
這將使實現者進行如下檢查:
if (typeof(x.then) === 'function') {
// adopt the state of x
} else {
// fulfill promise with value x
}
如果規范改為說“如果x是承諾,那么......”,實施者將如何知道是否x是承諾?沒有實際的方法可以確保是否x通過檢查來遵守Promise規范。
一個實現者(比如,庫FooPromises可能會做類似的事情
if (x instanceof FooPromises.Promise) {
// adopt the state of x
} else {
// fulfill promise with value x
}
它會有效地拒絕來自不同實現的任何承諾。
相反,通過thenable在這種條件下使用超級簡單的定義,實現者可以輕松驗證,進行此檢查并使實現彼此之間的相關性變得微不足道。
對于你的第二個問題,我不確定,但我的想法是,一個符號[[Resolve]](promise, x)強調它是一個抽象的操作。如果他們放下括號并且只是說Resolve(promise, x),它會以某種方式暗示實現者應該創建一個名為的實際函數Resolve并將其暴露出來。
這不是必需的 - Resolve不是承諾界面的一部分; 它只是他們行為的一部分,非常重要,它在文檔中被賦予了一個名稱和一個單獨的部分。
添加回答
舉報