Javascript 为错误处理格式化前端AJAX调用的最佳方法是什么?
我正在使用带有PHP后端的AngularJS。目前,我的错误处理非常混乱,如果我想添加一个新的错误,我必须将它添加到我站点上的每个API调用中(这需要几个小时) 我有一个称为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();
apiService
的角度服务,我将它注入到我的每个控制器中。下面是我如何调用该服务的示例:
apiService.getUserData(userId).then(function(userData) {
if(userData.status === 200) {
doStuffWithUserData();
} else {
displayError();
}
});
正如您所看到的,这是相当混乱的,因为我有大约50个这样的调用,所有这些调用都具有相同的错误处理。如果我想添加一个新的状态来监视,比如403禁止,我需要手动将其添加到我的50个呼叫中
这是myapiService
中的一个片段:
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很好用。这个解释帮助了一大堆人。谢谢。听到这个消息我很高兴。