使用$http获取数据以供自定义服务使用
Fetch data using $http for use with a custom service
我正在尝试创建一个自定义服务,它从服务器中提取所有已定义状态的列表,以便在表单中使用,到目前为止,我有:
SimpleTaskApp.factory('storyStatus', function($http) {
var data = null;
var promise = $http({
url: '/story-status/',
method: 'GET'
}).success(function (resp) {
data = resp;
});
return {list: data }};
});
我知道这不会工作,因为$http是异步的,但是我不想多次运行请求。我想把它当作一个静态变量,所以如果storyStatus。,它应该检查它是否为空,然后尝试填充自己。
您应该使用承诺而不是违背承诺。
不需要存储数据,因为可以存储承诺。承诺的意义在于你不知道什么时候会实现。你不知道你的数据何时可用。
所以你的服务必须返回承诺。不过没关系:SimpleTaskApp.factory('storyStatus', function($http) {
var promise;
function getData() {
if ( ! angular.isDefined( promise ) ) {
promise = $http({
url: '/story-status/',
method: 'GET'
});
}
return promise;
}
return { list: getData };
});
在此服务中,您的$http
调用将只被调用一次,但每当您调用SimpleTaskApp.list()
时将返回一个承诺。调用它的控制器不需要知道数据是否存在,因为它会做出相同的反应,例如:
SimpleTaskApp.controller('MainCtrl', function($scope, storyStatus) {
storyStatus.list().then(function( data ) {
$scope.statuses = data.statuses;
});
});
如果已经检索到数据,then
基本立即运行;如果没有,它将在数据返回时运行。控制器不需要知道storyStatus
服务的内部状态。
所以承诺不仅有助于异步任务,而且还有助于保持组件的解耦,这在AngularJS中是一件大事——在其他框架中也应该如此!
你可以这样做吗?
SimpleTaskApp.factory('storyStatus', function($http) {
var promise = $http({
url: '/story-status/',
method: 'GET'
});
return { list: promise };
});
调用代码
storyStatus.list.then(function (data) {
});
如果你只加载列表一次,你可能想考虑使用synchronous
ajax调用来简化你的API。
相关文章:
- 正在Angular 2中的扩展RouterOutlet中导入自定义服务以进行身份验证
- 如何正确地将数据从自定义服务传递到角度控制器
- AngularJs:在自定义服务中使用cookie
- 使用angularjs中的自定义服务交换ng src属性
- 在Angular 2中的另一个服务中注入自定义服务
- 如何使用angularJS自定义服务从REST API获取数据
- http的自定义服务不起作用
- Angularjs自定义服务变量未被$http成功定义
- 自定义服务没有加载,尽可能简单
- AngularJs 简单的自定义服务不起作用
- 内部服务器错误在 post 请求中使用 Angular js 中的自定义服务
- 角度 js 自定义服务/工厂无法注入控制器/配置
- 用于定义自定义服务的语法
- AngularJS在自定义服务中使用角度模块
- Angular 调用自定义服务 - 找不到调用源
- 如何在angularjs的自定义服务中注入$cookie
- 如何在纯ES5(Javascript)中向angular组件注入自定义服务
- 如何正确使用AngularJS中的自定义服务
- AngularJS:帮助以正确的方式注册自定义服务
- 返回一个布尔值的Angularjs自定义服务方法