簡體   English   中英

在Promise中混淆錯誤和拒絕

[英]Confuse about error and reject in Promise

所有:

我對JS Promise很陌生,在Promise鏈接方面有一個令人困惑的地方,比如說我有一個像以下鏈接的承諾:

var p = new Promise(function(res, rej){
})
.then(
    function(data){
    }, 
    function(err){
    })
.then(
    function(data){
    }, 
    function(err){
    })
.catch(
    function(err){
    })

讓我困惑的是:

  1. 當調用函數(錯誤)和調用catch時?
  2. 如何解決並拒絕then

謝謝

使用Promise的公式是:

var p = new Promise(function(resolve, reject) {

  var condition = doSomething();

  if (condition) {
    resolve(data);
  } else {
    reject(err);
  }

});

.catch沒有什么特別的,它只是.catch .then (undefined, func)糖,但是.catch更清楚地傳達它純粹是一個錯誤處理程序。

如果Promise沒有解決並且沒有提供拒絕回調,它會跳轉到鏈中的下一個.then ,其中包含拒絕回調。 拒絕回調是reject(err)

有關更詳細的說明,請參閱: Javascript Promises - There and Back


那就是:在你的例子中。 如果前面的拒絕回調中有錯誤,則只會調用catch 也就是說, reject(err)函數本身存在錯誤 - 這與前面的Promise無法解決無關。

你基本上可以把自己局限在一個拒絕回調.catch在您結束的.then鏈。 任何Error在任何.then再將始終陷入.catch 但有一個微妙之處: .catch任何錯誤都沒有被捕獲。

重要的是要知道.then()方法總是鏈接 Promise上,它返回一個新的 Promise,其值和解析/拒絕狀態基於給它返回的函數。

在您的示例中,如果原始Promise結算,則第一個.then()中的第一個函數將使用已解析的值進行調用。 如果它返回一個值則返回任何值隨后會最終傳遞到第一個功能在你的第二個 。那么()。 catch中的函數永遠不會被調用。

如果Promise拒絕,第一個.then()中的第二個函數將被拒絕的值調用,並且它返回的任何將成為一個新的已解析的Promise,它將傳遞到你的第二個函數中。 Catch也從未被稱為。 只有當Promise拒絕並且你繼續在你的function(err){}函數返回被拒絕的Promises或拋出錯誤時 ,你將在你的catch塊中調用function(err){}

要解決function(data){}函數,您需要做的就是返回一個值(或者返回一個稍后解析的Promise / thenable)。 要拒絕,您需要拋出錯誤,實際導致錯誤,返回最終拒絕的新Promise,或顯式返回Promise.reject(::some value::)

要解決function(err){}塊,您需要做的就是返回一個新值。 你也可以返回一個Promise,在這種情況下,Promise將被返回(最終解析或拒絕)。

一般來說,在同一個PROMISE.then(fn).catch(fn)定義已解析和被拒絕的路徑是PROMISE.then(fn).catch(fn)PROMISE.then(fn).catch(fn)是一種更安全/更清晰的做法,因為那時第一個中的任何錯誤。然后()將被catch抓住。 相反,如果你做了PROMISE.then(fn, fn) ,如果在第一個函數中發生錯誤,它就不會被第二個函數捕獲:一些后來鏈接的方法必須捕獲它。

  1. 請注意示例執行程序函數

    var p = new Promise(function(res, rej){});

    不完整。 提供給Promise構造函數的實際執行程序函數必須調用其第一個參數( res )來解析構造的promise,或者調用其第二個參數( rej )來拒絕promise。 這些調用通常是異步進行的,但不必在ES6中。

  2. 當使用Promise對象(或具有.then屬性的任何對象是函數)解析promise時,在解析本身提供的promise對象變為滿足拒絕之前,不會發生任何事情。 達到的值傳遞給.then onFulfilled處理,拒絕值傳遞到.then onRejected處理器/監聽器/回調(取決於您的術語)。

  3. 但是當使用非promise(如)對象解析promise時.then將使用分辨率值調用作為.then的第一個參數提供的偵聽器。

  4. 當一個承諾與任何值拒絕,聽眾提供作為第二個參數來.then ,或者第一參數.catch ,被稱為與被拒絕的值。

  5. .catch是調用.catch的委婉說法.then使用提供的參數作為第二個參數並省略第一個參數,如

    Promise.prototype.catch = function( listener) { return this.then(null, listener);};

  6. 的行為.then注冊onFulfillonReject功能是一樣的。 拒絕鏈式承諾會引發錯誤。 履行鏈式承諾會返回非承諾值。 持有鏈式承諾會返回一個承諾(或承諾)對象。


  7. (更新)當提供給.then( onFulfill, onReject)的參數缺失或不是函數對象時,處理相當於從以下位置提供虛函數:

     function onFulfill( data) { return data;} function onReject( err) { throw err;} 

    這是調用thencatch單個參數時的常見情況。

暫無
暫無

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

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