AngularJS,在服务中使用承诺
AngularJS, using a promise within a service
我有一个来自项目MVP的"非常胖的控制器"控制器,我想将其重构为更加模块化和划分的代码。
目前,我的控制器中有一个功能,它:
- 对 API 进行
$HTTP
调用 - 使用
for
循环和switch
语句处理返回的数据 - 将其保存到范围
我想将其移至服务。到目前为止,我有这个:
angular.module('myApp.services', [])
.service('apiService', ['$http', 'webapiBase', function($http, webapiBase) {
this.getData = function(){
$http.get(webapiBase + '/api/getData').then(function(res){
var obj = res.data;
// Processing stuff
return obj;
}, function(err){
return false;
})
}
}]);
在我的控制器中,当此服务返回其数据时,我需要运行回调,例如:
// In my Service:
this.getData = function(cb){
$http.get(webapiBase + '/api/getData').then(function(res){
var obj = res.data;
cb(obj);
}, function(err){
cb(false);
})
}
// In my controller
apiService.getData(function(data){
$scope.data = data;
// Do other stuff here
})
但这感觉有点奇怪/非"棱角分明"。
有没有一种更"角度"的方式来实现这一目标,也许在使用$q
时?
你只需要对你的服务做一个小的修改
this.getData = function(){
return $http.get(webapiBase + '/api/getData').then(function(res){
// Processing stuff
return object;
}, function(err){
return false;
})
}
直接返回$http.get
的承诺对象。然后在您的控制器中
apiService.getData().then(function(data){
$scope.data = data;
// Do other stuff here
})
编辑
如果你真的不想重用$http
创建的promise对象,你可以真正快速创建自己的。
this.getData = function() {
var deferred = $q.defer();
$http.get(webapiBase + '/api/getData').then(function(res){
// Processing stuff
deferred.resolve(object);
}, function(err){
deferred.reject('error');
});
return deferred.promise;
}
您可以使用
$q
来实现所需的内容。
// Your service
angular.module('myApp.services', [])
.service('apiService', ['$http', 'webapiBase', function($http, webapiBase) {
this.getData = function() {
var deferred = $q.defer();
$http.get(webapiBase + '/api/getData').then(
function (res) {
// Do something with res.data
deferred.resolve(res.data);
},
function(res){
deferred.reject();
}
);
return deferred.promise;
}
}]);
然后在控制器中使用$q
承诺并对其进行响应:
// Your controller
apiService.getData().then(function(data) {
$scope.data = data;
// Do other stuff here
});
这就是角度方式,使用承诺与$q
.
相关文章:
- 棱角分明的服务承诺
- 角度控制器服务承诺不起作用
- 服务承诺不以业力解决
- 承诺返回未定义的服务
- angular服务中的$http承诺
- 如何在两个连续的角度服务呼叫期间中止/取消第一个呼叫的承诺
- 服务中的承诺会自行取消
- 为根范围承诺提供角度服务
- 使用 Jasmine 2.4.* 测试返回承诺的服务
- 角度“this”符号和来自服务的数据,带有承诺
- AngularJS,在服务中使用承诺
- 角度控制器检查服务承诺更新视图
- 在解决承诺 AngularJS/ES6 后检索存储在服务中的数据
- 如何在返回承诺的服务中创建 reset() 方法
- AngularJS$http服务中的调用,返回解析的数据,而不是承诺
- 测试承诺与柴和西农的服务
- 解析服务依赖项中的承诺
- 当服务中存在嵌套的承诺关系时,AngularJS的行为很奇怪
- 本机浏览器承诺为一组查询的元素提供服务
- AngularJs的承诺服务