[英]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){
})
讓我困惑的是:
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)
,如果在第一個函數中發生錯誤,它就不會被第二個函數捕獲:一些后來鏈接的方法必須捕獲它。
請注意示例執行程序函數
var p = new Promise(function(res, rej){});
不完整。 提供給Promise構造函數的實際執行程序函數必須調用其第一個參數( res
)來解析構造的promise,或者調用其第二個參數( rej
)來拒絕promise。 這些調用通常是異步進行的,但不必在ES6中。
當使用Promise對象(或具有.then
屬性的任何對象是函數)解析promise時,在解析本身提供的promise對象變為滿足或拒絕之前,不會發生任何事情。 達到的值傳遞給.then
onFulfilled
處理,拒絕值傳遞到.then
onRejected
處理器/監聽器/回調(取決於您的術語)。
但是當使用非promise(如)對象解析promise時.then
將使用分辨率值調用作為.then
的第一個參數提供的偵聽器。
當一個承諾與任何值拒絕,聽眾提供作為第二個參數來.then
,或者第一參數.catch
,被稱為與被拒絕的值。
.catch
是調用.catch
的委婉說法.then
使用提供的參數作為第二個參數並省略第一個參數,如
Promise.prototype.catch = function( listener) { return this.then(null, listener);};
的行為.then
注冊onFulfill
和onReject
功能是一樣的。 拒絕鏈式承諾會引發錯誤。 履行鏈式承諾會返回非承諾值。 持有鏈式承諾會返回一個承諾(或承諾)對象。
(更新)當提供給.then( onFulfill, onReject)
的參數缺失或不是函數對象時,處理相當於從以下位置提供虛函數:
function onFulfill( data) { return data;} function onReject( err) { throw err;}
這是調用then
或catch
單個參數時的常見情況。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.