javascript - 在辅助工厂中使用 AngularJS $q promises

标签 javascript angularjs asynchronous deferred

<分区>

我正试图绕过何时在 AngularJS 中使用 $q。到目前为止,我一直在我的所有服务中使用它,所以当我调用我们的 Web API 时,它运行良好。我想做的是减少对 API 的所有调用,因为我需要在多个地方使用相同的数据,而且每次我需要数据时我都会对 API 执行 ping 操作。

现在我有一个服务,它获取数据和一个帮助文件来帮助处理与数据相关的事情。

我想要的是使用这个助手 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 Controller 中删除 githubService 依赖项,只让它出现在 githubHelper 工厂中,所以我可以从我所有的 Controller 中删除对 githubService 的依赖,而是使用 gitHubHelper

我需要在 Dummy Controller 中更改什么以使 $scope.value 成为从 githubService.getAccount() 返回的数据?

最佳答案

我的项目中有这样的东西:

app.factory("githubHelper", ["githubService", function(githubService) {
    var promise = null;

    function getInfo() {
      if (!promise) {
        promise = githubService.getAccount();
      }
      return promise;
    }

    return {
      getInfo: getInfo
    };
  }]);

githubHelper.getInfo().then(function(data) {})
githubHelper.getInfo().then(function(data) {})
githubHelper.getInfo().then(function(data) {})
...

关于javascript - 在辅助工厂中使用 AngularJS $q promises,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54758360/

相关文章:

javascript - 查找字符串中的相邻组

javascript - 在浏览器中订阅控制台事件

javascript - 使用 angularjs 获取休息服务

javascript - 如何在 jspdf.js 中设置导出表格的字体大小?

java - Apache Kafka 是否提供异步订阅回调 API?

node.js - async_ids有可能溢出吗?

javascript - 更改函数名称调用中的单击事件

javascript - jQuery-UI 对话框不会显示按钮

html - AngularJS ng-href 和 svg xlink

c# - Xamarin Forms C# 异步函数实现