簡體   English   中英

Promise.all不會捕獲錯誤

[英]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.allthis值正確(例如,使用箭頭函數):

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)回調參數采用兩個參數,在偶像上稱為resolvereject ,而您缺少后者。 不必拋出錯誤,而必須將其傳遞給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.

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