[英]Promise.all doesn't catch errors
我正在努力處理Promise.all的錯誤:
return Promise.all([
this.pagination(),
this.prepareParams(this.params, this.requestData),
this.fetchRecipes(this.apiData, this.params)
])
.catch(e => console.log());
首先,我只是試圖在this.pagination()
拋出一個異常,甚至對其進行了處理,但是奇怪的是盡管執行了下一個Promises。
pagination(): Promise<any> {
return new Promise(resolve => {
if(...) {
...
resolve();
} else {
...
throw "no more results";
}
}
然后,我嘗試改用Promise.reject("no more results")
,但是問題是它現在以某種方式忽略了我的catch
未抓到(承諾):沒有其他結果
只是為了向其他人澄清:我的初衷是,如果第一個Promise被拒絕,則阻止執行下兩個Promise。 我錯誤地認為Promise.all
可以滿足此要求。 多虧了traktor53的回答,我才意識到鏈接承諾是一個更好的解決方案。
Promise.all
在返回結果數組之前等待其參數數組中的所有promise均得到滿足,但是一旦數組中的任何 promise被拒絕(“快速拒絕”),它將立即拒絕它返回的promise。
then
Promise.all
調用傳遞的每個Promise.all
,以獲得其實現的價值或拒絕的原因。 如果其中一個被拒絕,它不會嘗試中止其他承諾 -Promise標准中沒有機制來取消已承諾的操作。
如果僅在成功完成先前的承諾后才想繼續執行承諾操作,請使用鏈接而非promise.all
,請注意在promise promise.all
中this
值正確(例如,使用箭頭函數):
function objectMethod () {
return this.pagination()
.then( data=>this.prepareParams(this.params, this.requestData))
.then( data=>this.fetchRecipes(this.apiData, this.params));
}
// catch errors encountered during call:
someObject.someMethod().catch(e => console.log(e));
Promise
構造函數(MDN)的回調參數采用兩個參數,在偶像上稱為resolve
和reject
,而您缺少后者。 不必拋出錯誤,而必須將其傳遞給reject
。 因此:
pagination(): Promise<any> {
return new Promise((resolve, reject) => {
if(...) {
...
resolve();
} else {
...
reject("no more results");
}
}
更好地在調用函數時添加try-catch塊
其他
pagination(): Promise<any> {
return new Promise((resolve, reject) => {
if(...) {
...
resolve();
} else {
...
reject("no more results");
}
}
在您的函數調用中。
pagination().then(err, value) {}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.