我知道在问这个问题时我看起来很愚蠢,但我无法弄清楚这一点。
我编写了一个服务来处理对服务器的post调用。 $q
服务将promise返回给已调用服务的控制器函数。
服务:
app.service('AjaxService', ['$http','$q','$log', function($http,$q,$log) {
return {
getSearchresultPost : function(url,data){
var defer = $q.defer();
$http.post(url, data)
.then(function(data, status, header, config){
defer.resolve(data);
}).then(function(data, status, header, config){
defer.reject(data);
});
return defer.promise;
}
};
}]);
控制器
app.controller("kitGuideNavigationController",['$scope','$window','$timeout','AjaxService',function($scope,$window,$timeout,AjaxService){
AjaxService.getSearchresultPost("/services/knowledge/getProducts",pathToCall)
.then(function(data){
console.log("Data ",data);
}).then(function(data){
console.log("Some Error Occured");
});
}]);
当我尝试运行代码时,我得到两个控制台都被打印出来。
我没有得到错误。有人帮忙吗?
答案 0 :(得分:1)
将第二个“然后”更改为“catch”,应该解决这个问题。在这两种情况下都必须这样做。
app.controller("kitGuideNavigationController",['$scope','$window','$timeout','AjaxService',function($scope,$window,$timeout,AjaxService){
AjaxService.getSearchresultPost("/services/knowledge/getProducts",pathToCall)
.then(function(data){
console.log("Data ",data);
}).catch(function(data){
console.log("Some Error Occured");
});
}]);
同样如我所见,您使用的是$ http,请检查here
答案 1 :(得分:1)
您可以更改服务并在$ http.post中传递第二个参数(错误函数)(文档:https://docs.angularjs.org/api/ng/service/$http):
app.service('AjaxService', ['$http','$q','$log', function($http,$q,$log) {
return {
getSearchresultPost : function(url,data){
var defer = $q.defer();
$http.post(url, data)
.then(function(data, status, header, config){
defer.resolve(data);
}, function(error, status, header, config){
defer.reject(error);
});
return defer.promise;
}
};
}]);
在你的控制器中你也可以传递第二个参数:
app.controller("kitGuideNavigationController",['$scope','$window','$timeout','AjaxService',function($scope,$window,$timeout,AjaxService){
AjaxService.getSearchresultPost("/services/knowledge/getProducts",pathToCall)
.then(function(data){
console.log("Data ",data);
}, function(error){
console.log("Some Error Occured", error);
});
}]);
答案 2 :(得分:0)
由于$ http服务已经返回一个承诺,因此无需使用$q.defer
制作承诺:
app.service('AjaxService', ['$http','$q','$log', function($http,$q,$log) {
return {
getSearchresultPost : function(url,data){
//var defer = $q.defer();
var promise = $http.post(url, data)
//.then(function(data, status, header, config){
.then(function (response) {
var data = response.data;
//defer.resolve(data);
//return data to resolve
return data;
//}).then(function(data, status, header, config){
}).catch(function(response) {
var data = response.data;
//defer.reject(data);
//throw data to reject with value
throw data;
});
//return defer.promise;
return promise;
}
};
}]);
另请注意,.then
和.catch
方法使用response
对象调用其函数,而不是data
但返回(或抛出)data
属性处理程序创建一个新的promise,用该值解析(或拒绝)。
AjaxService.getSearchresultPost(url,pathToCall)
.then(function(data){
console.log("Data ",data);
//}).then(function(data){
}).catch(function(data) {
console.log("Some Error Occured");
});
有关详细信息,请参阅AngularJS $q Service API Reference - Chaining Promises