在AngularJS服务中使用$ http回调
我有一个简单的Angular服务,它使用$ http来调用API。
app.service("MyService", function($http){
this.api = function(obj){
return $http.post("/some-route", obj).success(function(data){
//process data in various ways here
var returnObj = {
complete: true,
data: data
};
return returnObj;
});
}
});
在$ http回调中,我在返回数据之前处理数据。当我在我的控制器中调用此服务时,我想要获取已处理的数据。
下只给我的未处理数据:
MyService.api(someObj).success(function(data){
console.log(data);
});
我如何从回调处理过的数据?
的success
功能不会创建一个新的承诺,让你的控制器成功回调注册到了同样的承诺作为服务(原来的)。
相反,你可以使用then
,所以它会创建一个新的承诺,将与您returnObj
对象来解决:
// service
return $http.post("/some-route", obj).then(function(data){
// controller
myService.api().then(function(data) {
作品一种享受!非常感谢 – Coop 2015-04-06 13:16:42
我已经测试了一下你的代码,并猜测是什么?它为我工作。你能否确认一下,或者发给我更多的信息,我很高兴如果我能帮忙。
var app = angular.module('plunker', []);
app.service("MyService", function($http){
this.api = function(obj){
return $http.post("http://jsonplaceholder.typicode.com/posts", obj).success(function(data){
//process data in various ways here
console.log(data);
var returnObj = {
complete: true,
data: data
};
return returnObj;
});
}
});
app.controller('MainCtrl', function($scope,MyService) {
$scope.data = 'World';
MyService.api({oi: true}).success(function(data){
$scope.data = data
});
});
更新: 我误解你的问题。您想要处理回调中的数据以在您的操作中对其进行处理。你的代码不工作,因为success()实际上会返回一个promise,但它不会改变它,它会返回原来的。要去的是then(),它是可链接的并返回promise的修改版本。 为了反映我对场景的新视角,我已对蹲步者进行了更改。这是新的代码。 谢谢你的时间。
var app = angular.module('plunker', []);
app.service("MyService", function($http){
this.api = function(obj){
return $http.post("http://jsonplaceholder.typicode.com/posts", obj).then(function(data){
//process data in various ways here
console.log(data);
var returnObj = {
complete: true,
data: data
};
return returnObj;
});
}
});
app.controller('MainCtrl', function($scope,MyService) {
$scope.data = 'World';
MyService.api({oi: true}).then(function(data){
$scope.data = data
});
});
我很抱歉不理解你的问题。我正在烘烤另一个答案,并会尽快更新。 – netrevisanto 2015-04-06 13:12:36
我不认为这有效。 'returnObj'应该是返回到控制器的数据。这在你的例子中不会发生。 – Coop 2015-04-06 13:14:26
请检查我的更新!谢谢。 – netrevisanto 2015-04-06 14:43:42
你有没有过了这个“目标文件”的API – Reena 2015-04-06 12:32:41
无法链的多个'成功'。你可以链接'然后()'或传递一个回调作为参数,并在成功 – charlietfl 2015-04-06 12:35:51
@user抱歉错别字,是的,我已经通过了该对象。 – Coop 2015-04-06 12:36:54