Javascript 那么如何拒绝一个公司内部的承诺呢

Javascript 那么如何拒绝一个公司内部的承诺呢,javascript,ember.js,promise,es6-promise,Javascript,Ember.js,Promise,Es6 Promise,我希望能够拒绝整个承诺链,如果任何一个承诺以干净的方式失败。我想“捕获”此拒绝并发送错误通知。我通过以下代码实现了它: let reportMetaData = api.ajaxGet(api.buildV3EnterpriseUrl('reports' + '/' + params.report_id)) .catch(error => { if (error.status === constants.HTTP_STATUS.GATEWAY_TIMEOUT) {

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

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(iterable)

详情如下:

如果这不是您想要的,那么看看Bluebird——功能齐全的promise库

更新:如果要在函数中的任何承诺失败时拒绝整个承诺,请尝试实现:

throw validationError;

希望它能工作。

您需要使用
Promise.all()
并提供promises数组作为输入参数。 如果其中一个承诺失败,那么所有的承诺都不会得到解决。 文件如下:

这里有一篇关于他们的帖子,你可以在这里阅读:


您可以使用异步函数稍微清理一下。我认为您可以用以下代码替换您的代码

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

OP没有说明他们使用的是蓝鸟。是的,我发了它以防万一。不过,第一个链接是与ES6相关的承诺。那么你可能需要明确地说明这一点。只是说“使用这个”和一个链接不是很有用:)不使用蓝鸟。我正在使用余烬承诺。答应我,一切对我都不起作用。我希望能够拒绝来自then函数内部的承诺。所以,我得到了一个结果。我根据某些标准进行验证。如果验证失败,我想拒绝承诺。请检查这里。我猜几乎同样的问题是我错了,还是你已经通过退货承诺做了这件事。拒绝()?我认为你可以简单地离开一些错误捕捉器,它将全部转到最后一个…主要的问题似乎是你实际上没有一个链。你有几个单独的承诺,彼此之间没有任何关系。您是否打算将所有代码链接在一个承诺链中?您现在的问题无法回答,因为您显然已经知道如何从
.then()
内部拒绝,因为您已经在多个地方这样做了。但是,您必须将所有承诺收集在一起,比如
Promise.all()
,或者将它们链接到一个链中。我们不知道你的代码是什么。好的。我修改了我的问题。希望现在更清楚。基本上我想让我的代码更干净。顺便说一句,我确实有承诺。例如,aggregateReport对于aggregateData是“then”,individualReport对于aggregateData也是“then”。所以,这些都被锁在一起了。