簡體   English   中英

如何拒絕一個內在的承諾

[英]how to reject promise inside a then

如果任何承諾都以明確的方式失敗,我希望能夠拒絕整個承諾鏈。 我想“捕獲”此拒絕並發送錯誤通知。 我已經實現了以下代碼:

let reportMetaData = api.ajaxGet(api.buildV3EnterpriseUrl('reports' + '/' + params.report_id))
  .catch(error => {
    if (error.status === constants.HTTP_STATUS.GATEWAY_TIMEOUT) {
      this.notify.error(this.translate('reports.report_timedout'), this.translate('reports.report_timedout_desc'));
    } else {
      this.send('error', error);
    }
  });

let aggregateData = reportMetaData.then(success => {
  try {
    return api.xmlRequest('GET', success.aggregationUrls.elements[0].url);
  } catch (error) {
    return Promise.reject();
  }
}).then(rawData => {
  try {
    return JSON.parse('{' + rawData + '}');
  } catch (error) {
    return Promise.reject();
  }
}, error => Promise.reject(error));

let aggregateReport = aggregateData.then(data => {
  if (!data || !data.report) {
    return Promise.reject();
  }
  return data.report;
}).catch(error =>{ 
    this.notify.error(this.translate('reports.report_timedout'), error); 
});

如您所見,它非常混亂且復雜。 有辦法簡化嗎? 我想以最簡單的方式拒絕任何承諾失敗的整個承諾。 我該如何從then函數內部做到這一點? 另外,似乎拋出的錯誤一直在冒充未解決的錯誤,一直到chrome控制台。 為什么即使我抓住了它也會冒出來?

您需要使用Promise.all()並提供promise數組作為輸入參數。 如果這些承諾之一將失敗,那么所有的承諾都將無法解決。 這里的文檔:

https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Promise/all

在SO上的一則帖子中,您可以閱讀有關它們的信息:

什么時候使用promise.all()?

嘗試匯總Promise.all(iterable)下的所有內容。

此處更多內容: https : //developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Promise/all

如果這不是您想要的,請查看Bluebird-功能齊全的Promise庫。 這里

更新:如果您希望在函數內的任何承諾失敗時拒絕整個承諾,請嘗試實現:

throw validationError;

希望它能工作。

您可以使用異步功能來清理一些東西。 我認為您可以將代碼替換為以下代碼。

async function processDataAndReport() {
  try {
    const data = await api.ajaxGet(api.buildV3EnterpriseUrl('reports' + '/' + params.report_id));
    const rawData = await api.xmlRequest('GET', data.aggregationUrls.elements[0].url);
    const { report } = JSON.parse(`{${rawData}}`);                         
  } catch(e) {
    // send notification
  }
}

暫無
暫無

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

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