在 AngularJS 服务中使用 $http 回调
Using $http callback inside AngularJS service
我有一个简单的 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);
});
如何从回调中获取处理后的数据?
我已经在 plunker 中测试了你的代码,你猜怎么着?它为我工作。能否确认一下,或者发给我更多信息,如果能帮上忙,我很高兴。
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() 实际上 returns 一个承诺,但它不会更改它,它 returns 原来的。要使用的是 then(),它是可链接的并且 returns 是 promise 的修改版本。
我对 plunker 进行了更改以反映我对场景的新看法。这是新代码。
谢谢你的时间。
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
});
});
success
函数不会创建新的承诺,因此您的控制器成功回调已注册到与服务相同的承诺(原始承诺)。
相反,您可以使用 then
,因此它将创建一个新的承诺,该承诺将通过您的 returnObj
对象解决:
// service
return $http.post("/some-route", obj).then(function(data){
// controller
myService.api().then(function(data) {
我有一个简单的 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);
});
如何从回调中获取处理后的数据?
我已经在 plunker 中测试了你的代码,你猜怎么着?它为我工作。能否确认一下,或者发给我更多信息,如果能帮上忙,我很高兴。
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() 实际上 returns 一个承诺,但它不会更改它,它 returns 原来的。要使用的是 then(),它是可链接的并且 returns 是 promise 的修改版本。 我对 plunker 进行了更改以反映我对场景的新看法。这是新代码。 谢谢你的时间。
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
});
});
success
函数不会创建新的承诺,因此您的控制器成功回调已注册到与服务相同的承诺(原始承诺)。
相反,您可以使用 then
,因此它将创建一个新的承诺,该承诺将通过您的 returnObj
对象解决:
// service
return $http.post("/some-route", obj).then(function(data){
// controller
myService.api().then(function(data) {