格式化前端AJAX调用以进行错误处理的最佳方法是什么?

时间:2016-01-26 23:37:40

标签: javascript angularjs ajax api

我正在使用带有PHP后端的AngularJS。目前,我的错误处理非常混乱,如果我想添加一个新的错误,我必须将它添加到我的网站上的每个API调用(这将需要几个小时)。

我有一个名为apiService的Angular服务,我将其注入每个控制器。以下是我如何调用该服务的示例:

apiService.getUserData(userId).then(function(userData) {
  if(userData.status === 200) {
    doStuffWithUserData();
  } else {
    displayError();
  }
});

正如您所看到的,它非常混乱,因为我有大约50个这些调用都具有相同的错误处理。如果我想添加一个要监视的新状态,例如403 forbidden,我需要手动将其添加到我的50个呼叫中。

这是我apiService

的摘录
function runApiCall(apiRequest, apiData) {
  return $http({
    method: 'POST',
    url: apiRequest,
    data: apiData,
    headers: {
      'Content-Type': 'application/x-www-form-urlencoded'
    }
  });
}


return {
  getUserData: function(userId) {
    var apiRequest = "http://mydomainhere.com/api/getUserData";
    var apiData = $.param({
      userId: userId
    });

    return runApiCall(apiRequest, apiData).then(function(data) {
      return data;
    });
  }
}

由于我网站上的每个API调用直接通过runApiCall函数,是否可以以某种方式进行所有错误处理?

1 个答案:

答案 0 :(得分:2)

您可以通过Component服务返回的原始承诺链接来扩充您的runAPICall功能。

链接正确履行承诺,返回对链接功能的响应。要正确地链接被拒绝的承诺,抛出对链接函数的错误响应。

$http

对于function runApiCall(apiRequest, apiData) { var httpPromise = $http({ method: 'POST', url: apiRequest, data: apiData, headers: { 'Content-Type': 'application/x-www-form-urlencoded' } }); var derivedPromise = httpPromise.then ( function onFullfilled (response) { if (response.status === 200) { doStuffWithUserData(); } else { displayOtherStatus(); } //return response for chaining return response; }, function onRejected (errorResponse) { if (errorResponse.status == 403) { console.log("403 forbidden"); } else { console.log("other error " + errorResponse.status); }; //throw errorResponse for chaining rejection throw errorResponse; } ); return derivedPromise; }; 服务,200到299之间的响应状态代码被视为成功状态,并将导致调用$http回调。请注意,如果响应是重定向,XMLHttpRequest将透明地跟随它,这意味着不会为此类响应调用onFulfilled回调。 1

拒绝承诺可以转换,通过返回到onRejected函数来实现承诺。相反,已履行承诺可以转换,拒绝承诺投掷onRejected函数。

可以创建任意长度的链,并且由于可以使用另一个承诺(将进一步推迟其解析)来解决承诺,因此可以在链中的任何点暂停/推迟承诺的解析。这使得实现强大的API成为可能。 2

拦截

拦截器是通过将onFulfilled阵列添加到$httpProvider来注册的服务工厂。调用工厂并注入依赖项(如果指定)并返回拦截器。

有关详细信息,请参阅AngularJS $http API Reference -- interceptors