您如何处理链式承诺的错误

How do you handle errors from chained promises?

本文关键字:承诺 错误 处理 何处理      更新时间:2023-09-26

我正在构建一个 Angular 应用程序,并且有一个执行 XHR 的工厂,并将承诺返回给调用它的控制器。当我收到错误时,它会在工厂失败方法中捕获,但由于我将其作为承诺返回,它仍然在控制器中调用成功方法。有没有办法让工厂错误传递给控制器失败方法并阻止调用控制器成功方法?原因是我想在客户端正确显示成功和错误通知。我只是完全错了吗?

示例工厂方法:

function add(payload) {
  return $http.post('/companies', payload)
    .then(success)
    .catch(fail);
  function success(response) {
    return response.data;
  }
  function fail(error) {
    $log.log('Company Factory XHR failed: ', error.data);
  }
}

对应控制器方式:

function add(isValid) {
  if (isValid) {
    var payload = {
      company: vm.new_company
    };
    companyFactory.add(payload)
      .then(success)
      .catch(fail);
  }
  function success() {
    getCompanies();
    vm.new_company = {};
    toastrFactory.success("Added company!");
  }
  function fail(err) {
    $log.log('Companies Controller XHR Failed: ' + err.data);
  }
}

如果您在控制器中处理承诺,则无需在工厂中处理承诺。

在工厂里,你只想

return $http.post('/companies', payload);

然后处理它,就像你已经在控制器中一样,你就可以开始了。

使用 .then 和 .catch 是承诺的函数,就像你现在在工厂里做的那样,你不是在返回承诺,而是在承诺解决后返回其他东西。你只想单独返回承诺,即 $http.post() 函数。

编辑:为了增加一点深度,这就是我为这种东西设置工厂的方式......

function factory() {
   var self = {};
   self.addCompany = function(payload) {
     return $http.post('/companies', payload);
   }
   return self;
}

然后在控制器中处理它,例如

factory.addCompany(payload)
  .then(function(data) {
    console.log('success', data);
  })
  .catch(function(data) {
    console.log('something happened', data);
  })