【问题标题】:How do you handle errors from chained promises?你如何处理来自链式承诺的错误?
【发布时间】:2016-03-10 15:18:56
【问题描述】:

我正在构建一个 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);
  }
}

【问题讨论】:

    标签: javascript angularjs xmlhttprequest promise


    【解决方案1】:

    如果你在控制器中处理promise,你不需要在工厂处理它。

    在你想要的工厂里

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

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

    使用 .then 和 .catch 是 Promise 上的函数,就像您现在在工厂中所做的那样,您不会返回 Promise,而是在 Promise 解决后返回其他内容。你只想单独返回 promise,也就是 $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);
      })
    

    【讨论】:

    • 呃,为什么要让自己做额外的工作?感谢您的帮助!
    猜你喜欢
    • 1970-01-01
    • 2018-01-22
    • 2015-07-03
    • 1970-01-01
    • 2015-05-24
    • 2018-11-07
    • 2017-01-22
    • 2019-09-25
    • 2014-08-12
    相关资源
    最近更新 更多