目前我在控制器中使用$ http.success()。error()。但是,angular已经弃用了成功/错误支持,并且根据样式指南,写入服务器$ http调用的最佳位置是服务。
鉴于此,我想知道以下代码是否是正确的前进方式。
控制器:
var funcWithPromise = function() {
// This service's function returns a promise, but we'll deal with that shortly
TestService.getWeather()
.then(function(data) {
if (data.forecast==='good') {
prepareFishingTrip();
} else {
prepareSundayRoastDinner();
}
}, function(response) {
// promise rejected, could log the error with:
$scope.errorDiv = response.data;
console.log('error', response);
//Manipulate DOM
});
};
服务
app.factory('TestService', function ($http, $q) {
return {
getWeather: function() {
// the $http API is based on the deferred/promise APIs exposed by the $q service
// so it returns a promise for us by default
return $http.get('http://weather')
.then(function(response) {
return response.data;
}, function(response) {
// something went wrong
return $q.reject(response); //Not sure is it must be response or reponse.data here. With reponse I can utilize response.status.
});
}
};
});
答案 0 :(得分:1)
关注'官方'文档,你是正确的,所以继续。
我会做像你这样的事情。这里是官方文档的链接:https://docs.angularjs.org/api/ng/service/$http
答案 1 :(得分:1)
我不会盲目地这样做
$http(..).then(function(response) {
return response.data;
});
以上假设所有有效的HTTP响应都会变异为数据,但这与您执行此操作时的情况不同。
$http(..).success(function(data) {
return data;
});
$ http中的成功回调仅在响应状态为200系列代码时触发,当您切换到then
所有成功的HTTP响应(200,300,400等)时。)作为已解决的回复处理。
因此,你想要做这样的事情。
return $q(function(resolve,reject){
$http(..).then(function(response) {
if(response.status == 200) {
resolve(response.data);
} else {
reject(response);
}
});
});
这将解决仅对响应中的数据成功的200个响应。现在,您的服务返回的承诺将仅解析为该数据或被拒绝。
对于错误处理,我建议您使用拦截器而不在指令中实现错误处理(除非有特殊情况)。