我试图将$ http.post()调用分成" .factory()",但是想获取控制器上异步的响应。有没有办法做到这一点?
控制器:
.factory( 'Login' , function($http,SERVERURL){
var serverUrl = SERVERURL;
return {
'post' : function(user){
$http.post(serverUrl+'/login', user).
then(function(response) {
console.log(response);
}, function(response) {
// called asynchronously if an error occurs
// or server returns response with an error status.
});
}
};
})
厂:
{{1}}
有一个.then()但我希望在控制器上,所以我可以相应地表现。谢谢!
答案 0 :(得分:2)
基本上你需要返回$http.post
承诺,并且从success函数中你可以返回一个将返回给这个方法的使用者的数据。这样您就可以轻松地从控制器和工厂调用工厂方法。在该调用的.then
函数内,您可以success
和error
函数。
<强>代码强>
.factory('Login', function($http, SERVERURL) {
var serverUrl = SERVERURL;
return {
'post': function(user) {
return $http.post(serverUrl + '/login', user).
then(function(response) {
console.log(response);
return response.data; //return data from here
}, function(response) {
// called asynchronously if an error occurs
// or server returns response with an error status.
});
}
};
})
<强>控制器强>
Login.post().then(function(data){ //success function
console.log(data)
}, function(error){ //error function
console.log(error);
})
答案 1 :(得分:0)
Angular's $http
方法返回一个Promise。
$ http API基于$ q服务公开的延迟/承诺API。
<强>工厂强>
您的方法post
尚未返回任何内容,但可以简单地返回通过调用$http.post
创建的Promise:
.factory('Login' , function($http, SERVERURL){
var serverUrl = SERVERURL;
return {
'post' : function (user) {
return $http.post(serverUrl + '/login', user)
// ^^^^^^
.then(function (response) {
console.log(response);
return response.data;
}, function (response) {
// called asynchronously if an error occurs
// or server returns response with an error status.
});
}
};
});
<强>控制器强>
然后通过调用then
来消耗返回的Promise的结果:
Login.post($scope.user).then(function (res) {
// do something with `res`...
});
答案 2 :(得分:0)
您可以添加回调参数。
.factory( 'Login' , function($http,SERVERURL){
var serverUrl = SERVERURL;
return {
'post' : function(user, callback){
$http.post(serverUrl+'/login', user).
then(function(response) {
console.log(response);
callback(null, response);
}, function(response) {
// called asynchronously if an error occurs
// or server returns response with an error status.
callback(response);
});
}
};
})
你的控制器将成为:
Login.post($scope.user, function(err, response) {
if(err) {} //do something if there is an error
// or deal with the response
});
答案 3 :(得分:0)
要向控制器返回任何响应,请执行以下操作:
return {
'post' : function(user){
return $http.post(serverUrl+'/login', user);
}
};
在您的控制器中,您已拨打.then()