2 回答

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

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