簡體   English   中英

帶有 Promise 的不同 function 調用類型

[英]Different function call types with Promises

它們在方面有何不同

  • 執行順序
  • 異常處理
  • 返回值

等等

  getFromURL().then(function () {
      return callbackFunc();
    });
    
    getFromURL().then(function () {
      callbackFunc();
    });
    
    getFromURL().then(callbackFunc());
    
    getFromURL().then(callbackFunc);

他們返回相同的結果

這是不正確的。 他們並不是都在做同樣的事情。

您的選項#1 和#4 是合理的做事方式。 您的選項 #2 可能是錯誤的,特別是如果callbackFunc()是異步的。 您的選項 #3 總是錯誤的,除非callbackFunc()返回一個您希望在 promise 鏈中調用的 function 並且您希望在getFromURL()解析之前調用它(這兩種情況都很少見)。

要查看所有這些之間的區別,您需要callbackFunc()的返回值,並且需要第二個.then()以便您可以看到該返回值。

因此,假設callbackFunc()返回“hello”。 然后,這就是你得到的。 這兩個是相同的:

getFromURL().then(function () {
  return callbackFunc();
}).then(result => {
  console.log(result);
});

getFromURL().then(callbackFunc).then(result => {
  console.log(result);
});

這兩個都將記錄調用callbackFunc()的返回值或由callbackFunc()返回的 promise 的解析值(無論它返回),或者如果callbackFunc()返回一個被拒絕的 promise,那么 ZB321DE3BDC279EC807E9F7D 鏈將接受該拒絕。 這兩種方案是執行 promise 鏈的常規方法,其中在getFromURL()解析后, callbackFunc()被排序到 promise 鏈中。


這個總是記錄undefined

getFromURL().then(function () {
  callbackFunc();
}).then(result => {
  console.log(result);
});

因為第一個.then()處理程序沒有返回值。 callbackFunc()的調用順序與前兩個相同,但由於您沒有從.then()處理程序返回它的返回值,因此它是孤立的並與 promise 鏈分離,並且 promise 鏈具有undefined的解析值.

如果callbackFunc()是異步的,那么這可能是錯誤的,因為callbackFunc()不是 promise 鏈的一部分,並且由於您沒有從 .then .then()處理程序返回它的 promise,因此無法跟蹤其成功或失敗。 這成為一個“一勞永逸”的獨立 promise 鏈。 如果它拒絕,您將收到系統錯誤,因為未捕獲的拒絕。

如果callbackFunc()是同步的並且您不關心它的返回值,那么這只是在getFromURL()像前兩個選項一樣解析之后對callbackFunc()進行排序,只是您忽略了返回值。


這一個與其他的最不同:

getFromURL().then(callbackFunc()).then(result => {
    console.log(result);
});

它將在getFromURL()解析之前調用callbackFunc() 它的返回值將傳遞給.then() 除非該返回值是 function 引用,否則 promise 鏈將完全忽略它。

getFromURL().then(function () {
  return callbackFunc();
});

此語句返回一個 Promise,它將使用callbackFunc()返回的值進行解析(如果callbackFunc返回一個 Promise,則遵循任何 Promise 鏈)。 這是一種常見的模式。


getFromURL().then(function () {
  callbackFunc();
});

此語句返回一個 Promise,它以 undefined 解析。 如果callbackFunc()是異步的,則外部 Promise 在callbackFunc()完成之前解析。 通常這可能是不可取的。


getFromURL().then(callbackFunc());

該語句立即調用callbackFunc() ,然后將它返回的任何內容傳遞給.then() 結果未定義。 沒有看到callbackFunc就不知道它做了什么。 可能會導致錯誤。


getFromURL().then(callbackFunc);

該語句返回一個 Promise ,它將使用callbackFunc()返回的值進行解析。 它與第一個基本相同,完全可以接受。

通常,#1 和#4 是您想要使用的。 #2 和 #3 要么草率要么錯誤。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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