【发布时间】:2019-07-12 11:47:24
【问题描述】:
我正试图绕开 AngularJS 中何时使用 $q。到目前为止,我一直在我的所有服务中使用它,所以当我调用我们的 Web API 时,它运行良好。我要做的是减少对 API 的所有调用,因为我在多个地方需要相同的数据,而且每次需要数据时我都在 ping API。
现在我有一个服务,它获取数据和一个帮助文件来帮助处理与数据相关的事情。
我想要的是使用这个帮助器 factory 来保存每个使用它的机构所需的数据。
如果在 AngularJS 运行时数据还没有返回给我,我很难从帮助文件中分配数据的值。
这是我目前所拥有的。
(function() {
var app = angular.module("Test", []);
app.service("githubService", function($http, $q) {
var deferred = $q.defer();
this.getAccount = function() {
return $http.get('https://api.github.com/users/JonDoe');
};
});
app.factory("githubHelper", ["githubService", function(githubService) {
_gitHubInfo = {};
githubService.getAccount().then(function(data) {
_gitHubInfo = data;
});
return {
gitHubInfo: _gitHubInfo
};
}]);
app.controller("Dummy", ["$scope", "githubHelper", "githubService", function($scope, githubHelper, githubService) {
// How do I make it work this way?
$scope.value = githubHelper.gitHubInfo;
// This is what I'm using now
githubService.getAccount().then(function(data) {
$scope.value2 = data;
});
}]);
})();
.box {
border: 1px red solid;
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/angular.js/1.7.5/angular.min.js"></script>
<div ng-app="Test">
<div ng-controller="Dummy">
<div class="box">
{{value}}
</div>
<br />
<div class="box">
{{value2}}
</div>
</div>
</div>
我想要做的只是从Dummy 控制器中删除githubService 依赖项,并且只将它存在于githubHelper 工厂中,这样我就可以从我的所有控制器中删除对githubService 的依赖项,而是使用gitHubHelper.
我需要在Dummy 控制器中更改什么以使$scope.value 成为从githubService.getAccount() 返回的数据?
【问题讨论】:
-
事实上,你是双重反模式,因为你返回 $http 承诺,然后从解析器返回延迟承诺......它就足够了调用 http.get,然后立即返回deferred.promise。反模式,是的,但比这更让人头疼
-
更新到现在只返回来自
$http.get的承诺。
标签: javascript angularjs asynchronous deferred