javascript - 如何拒绝 then 中的 Promise

标签 javascript ember.js promise es6-promise

如果任何一个 promise 以干净的方式失败,我希望能够拒绝整个 promise 链。我想“捕获”此拒绝并发送错误通知。我已经实现了以下代码:

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); 
});

正如你所看到的,它非常困惑和复杂。有什么办法可以简化这个过程吗?如果有人 promise 失败,我想要最简单的方法来拒绝整个 promise 失败。我如何从 then 函数内部做到这一点?另外,似乎抛出的错误一直作为 Uncaught Error 一直冒泡到 chrome 控制台。为什么我抓到了它还是冒泡?

最佳答案

您需要使用 Promise.all() 并提供 Promise 数组作为输入参数。 如果其中一项 promise 失败,则所有 promise 都将无法兑现。 这里是文档:

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise/all

这里有一篇关于 SO 的文章,您可以在其中阅读有关它们的信息:

When to use promise.all()?

关于javascript - 如何拒绝 then 中的 Promise,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44168914/

相关文章:

javascript - EmberJs : RESTAdapter could not get json file, 显示错误 404(未找到)

javascript - 向 promise 结果添加额外数据

javascript - Q.js 进度处理程序似乎没有触发

javascript - Promise 的 .then() 不接受分配给变量的函数?

javascript - 在一行中显示所有元素,但保留最后一项空间?

javascript - TypeError : Cannot read property 'Countries' of undefined. 为什么对象数组不被识别,不被过滤?

ember.js - 从设计到开发: Is there a common EmberJS workflow?

javascript - JQuery 选择 <span> 中最初不存在的元素

javascript - 为什么我的 JQuery UI 对话框不注册 keydown 事件?

javascript - 如何将删除的记录同步到后台