簡體   English   中英

Promise.then(()=>function()) 與 Promise.then(function)

[英]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.logcallback現在都引用了相同的 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.

     
    粵ICP備18138465號  © 2020-2024 STACKOOM.COM