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

Javascript 为错误处理格式化前端AJAX调用的最佳方法是什么?,javascript,angularjs,ajax,api,Javascript,Angularjs,Ajax,Api,我正在使用带有PHP后端的AngularJS。目前,我的错误处理非常混乱,如果我想添加一个新的错误,我必须将它添加到我站点上的每个API调用中(这需要几个小时) 我有一个称为apiService的角度服务,我将它注入到我的每个控制器中。下面是我如何调用该服务的示例: apiService.getUserData(userId).then(function(userData) { if(userData.status === 200) { doStuffWithUserData();

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

我有一个称为
apiService
的角度服务,我将它注入到我的每个控制器中。下面是我如何调用该服务的示例:

apiService.getUserData(userId).then(function(userData) {
  if(userData.status === 200) {
    doStuffWithUserData();
  } else {
    displayError();
  }
});
正如您所看到的,这是相当混乱的,因为我有大约50个这样的调用,所有这些调用都具有相同的错误处理。如果我想添加一个新的状态来监视,比如403禁止,我需要手动将其添加到我的50个呼叫中

这是my
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
函数进行,因此是否有可能以某种方式在那里进行所有错误处理?

您可以通过链接
$http
服务返回的原始承诺中扩展
runApiCall
函数

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

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;
};
对于
$http
服务,介于200和299之间的响应状态代码被视为成功状态,并将导致调用
oncompleted
回调。注意,如果响应是重定向,XMLHttpRequest将透明地跟随它,这意味着不会为此类响应调用
onRejected
回调

通过返回
onRejected
功能,可以将拒绝的承诺转换为履行的。相反,通过将
oncompleted
函数抛出,可以将已履行的承诺转换为已拒绝的

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


拦截器 拦截器是通过将它们添加到
$httpProvider.interceptors
数组而向
$httpProvider
注册的服务工厂。调用工厂并注入依赖项(如果指定)并返回拦截器


有关更多信息,请参阅。

可以在
httpInterceptor
中添加全局错误处理程序。不难发现Examples很好用。这个解释帮助了一大堆人。谢谢。听到这个消息我很高兴。