我正在使用带有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
函数,是否可以以某种方式进行所有错误处理?
答案 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
来注册的服务工厂。调用工厂并注入依赖项(如果指定)并返回拦截器。