我正在尝试从我的控制器向服务传递一个http响应,它运行良好除了让响应进入控制器这里是我的代码:
我的服务
app.factory('ApiService',function($http,Config,$q){
return {
login: function(payload,callBack){
var deferred = $q.defer();
$http({
method:'POST',
url:Config.baseUrl + '/api/login',
data:payload,
headers: {'Content-Type': 'application/json'},
}).then(function successCallback(callBack){
console.log(callBack);
return deferred.resolve(callBack);
}, function errorCallback(callBack){
//deferred.reject(error);
console.log(callBack);
return deferred.reject(callBack);
});
return deferred.promise;
}
}
});
和控制器
app.controller('LoginCtrl', function($scope,$position,$rootScope,$state,ApiService) {
$scope.forms = {
'loginForm':''
}
var payload ={
'username':'',
'password':''
}
$scope.userLogin = function(form){
$scope.username = form.username.$modelValue;
$scope.password = form.password.$modelValue;
payload ={
"username":$scope.username,
"password":$scope.password
}
ApiService.login(payload, function(result){
console.log(result);
}
});
现在我不明白,因为当我console.log()
响应时,我能够在服务中看到它但在控制器上做同样的事情我什么都没得到。
答案 0 :(得分:3)
无需使其复杂化。只需从factory
返回承诺,并在controller.
工厂:
app.factory('ApiService',function($http,Config,$q) {
return {
login: function(payload) {
return $http({
method:'POST',
url:Config.baseUrl + '/api/login',
data:payload,
headers: {'Content-Type': 'application/json'},
});
}
}
});
控制器中的:
ApiService.login(payload).then(function(data){
// use response data
}, function(error) {
// handle error
});
答案 1 :(得分:1)
您应该像这样使用它:
ApiService.login(payload).then(function(result){
console.log(result);
});
因为您要在服务中退回承诺。
此外,您不需要该回调参数,因为承诺上的then
方法是您完成后的回调,您可以访问您解决的数据。
app.factory('ApiService',function($http,Config,$q){
return {
login: function(payload){
var deferred = $q.defer();
$http({
method:'POST',
url:Config.baseUrl + '/api/login',
data:payload,
headers: {'Content-Type': 'application/json'},
}).then(function (result){
return deferred.resolve(result);
}, function (result){
return deferred.reject(result);
});
return deferred.promise;
}
}
});