[英]Promise.then(()=>function()) vs. Promise.then(function)
我正在了解 Javascript 中的 Promise ,但我不知道為什么這些是相同的:
let fifteen = Promise.resolve(15);
fifteen.then(value => console.log(value));
對比
let fifteen = Promise.resolve(15);
fifteen.then(console.log);
任何指針將不勝感激。
這種模式與 Promise 無關。 它與傳遞回調有關。 原理與例如array.forEach
相同,或者與setTimeout
或您自己的可以接收回調的 function 相同。
因此,例如,如果您自己定義這樣的 function,它可能是(就像您在評論中提到的那樣):
function test(callback) {
callback("test-output");
}
如果你想打印“test-output”,你可以在這個簡短的版本中調用test
:
test(console.log);
你也可以在這個更長的版本中這樣稱呼它:
test((value) => console.log(value));
在后一種情況下,您實際上是即時創建了一個匿名(箭頭)function:
(value) => console.log(value)
這是對console.log
的包裝。 如果你用一些參數調用它,你最終會用相同的參數調用console.log
。 您以某種方式創建了console.log
的同義詞,因為對於外部世界,它的行為方式相同。 您可以做一些更詳細的事情,並以非匿名方式定義 function:
function wrapper(value) {
console.log(value)
}
然后在我們有匿名 function 的地方使用它——現在命名為——function:
test(wrapper);
我們沒有做太多改變:我們只是將 function 移到另一個位置,將其變成非箭頭 function(不是真正需要),並為其命名( wrapper
)。 所以名稱wrapper
現在是 function 的同義詞。 因此,通過test
與通過文字 function 定義本身是一樣的。
現在很清楚,我們只是在對console.log
的最終調用之上添加了一個微小的額外層:首先我們調用test
,然后test
將調用wrapper
,最后wrapper
將調用console.log
。
第一種更短的調用test
的方法並不是繞圈子:它只是說:“我希望你調用的 function 是console.log
”。 所以test
稱之為:
callback("test-output");
它提供了參數“測試輸出”。 現在要意識到callback
變量是對console.log
的引用,因為這是我們傳遞給test
的參數。 console.log
和callback
現在都引用了相同的 function。 所以callback("test-output")
和console.log("test-output")
一樣。
所以在這里我們比更長的版本少一級。 順序是我們調用test
,然后test
調用console.log
。 包裝紙不在那里。
注意:這里有一些關於this
綁定的事情要說,這與上面的例子沒有任何關系,但是如果這個話題讓你感興趣/感興趣,那么請閱讀更多關於它的內容: this
關鍵字在 JavaScript 中是如何工作的。
的區別
.then(console.log)
.then((value)=>console.log(value))
console.log
隱式接收結果,而在第二種情況下顯式接收結果。 所以結果是一樣的。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.