首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >AngularJS服务延迟API调用

AngularJS服务延迟API调用
EN

Stack Overflow用户
提问于 2014-10-20 15:58:35
回答 2查看 1.3K关注 0票数 0

我试图在没有将所有信息存储在JS或我自己的API中的情况下,从GitHub回购中获取一个国家列表,所以我编写了一个一次性服务来处理这个问题,并将结果缓存在浏览器中,以防再次需要它们。然而,我注意到,按照我编写它的方式,$http.get被称为on load,而不是在向控制器中注入服务时--这意味着浏览器正在请求所有这些国家的数据,即使它是不需要的(例如,当用户访问国家页面时也是如此。

因为服务只是返回一个承诺,所以我可以在控制器中调用countrylist.then(...)。是否有办法保留这一点,但仍将请求推迟到真正需要的时候?

代码如下:

代码语言:javascript
复制
angular.module('myModule')
    .factory('countrylist', ['$http', 'growl', '$q', function ($http, growl, $q) {

        var deferred = $q.defer();
        var flagUrl = "https://raw.githubusercontent.com/hjnilsson/country-flags/master/png250px/{}.png";

        $http.get('https://raw.githubusercontent.com/lukes/ISO-3166-Countries-with-Regional-Codes/master/slim-2/slim-2.json',
                {cache: true})
                .success(function (data) {
                    angular.forEach(data, function (item) {
                        item.flag = flagUrl.replace("{}", item['alpha-2'].toLowerCase());
                    });

                    deferred.resolve(data);
                }).error(function (data) {
                    growl.warn("Error loading country data");
                    deferred.reject();
                });

        return deferred.promise;

    }]);
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-10-20 16:09:47

一旦工厂被注入到任何控制器中,工厂中的所有东西都会立即运行,这是在应用程序被引导时发生的。

唯一的方法是使用获取数据的方法从工厂返回一个对象。

代码语言:javascript
复制
angular.module('myModule')
.factory('countrylist', ['$http', 'growl', '$q', function ($http, growl, $q) {
  return {
    fetch: function() {
      var deferred = $q.defer();
      var flagUrl = "https://raw.githubusercontent.com/hjnilsson/country-flags/master/png250px/{}.png";

      $http.get('https://raw.githubusercontent.com/lukes/ISO-3166-Countries-with-Regional-Codes/master/slim-2/slim-2.json',
            {cache: true})
            .success(function (data) {
                angular.forEach(data, function (item) {
                    item.flag = flagUrl.replace("{}", item['alpha-2'].toLowerCase());
                });

                deferred.resolve(data);
            }).error(function (data) {
                growl.warn("Error loading country data");
                deferred.reject();
            });

      return deferred.promise;
    }
  };
}]);

然后在你的控制器里你显然要做

代码语言:javascript
复制
countryList.fetch().then(...)
票数 1
EN

Stack Overflow用户

发布于 2014-10-20 16:19:17

让它变得简单。很简单就像

  1. 在服务中返回promise (不需要在服务中使用then )
  2. 在控制器中使用then

演示。http://plnkr.co/edit/cbdG5p?p=preview

代码语言:javascript
复制
var app = angular.module('plunker', []);

app.service('myService', function($http) {
  return {
    async: function() {
      return $http.get('test.json');  //1. this returns promise
    }
  };
});

app.controller('MainCtrl', function( myService,$scope) {
  myService.async().then(function(d) { //2. so you can use .then()
    $scope.data = d;
  });
});

这是我从Processing $http response in service收到/粘贴的答案

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/26469924

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档