$ http同步调用其他文件中的其他$ http

时间:2017-01-12 06:56:42

标签: javascript angularjs http synchronization angular-services

我想从一个json文件中读取URL并将URL提供给具有$ http GET请求的其他javascript文件以执行该URL。我正在使用一项服务 在另一个服务文件中获取数据。当我运行它时,它在 bannerslides 函数中显示未定义。

文件:common.js

(function() {
    angular.module('siteModule')
    .service('loggerService', function ($http, $q) 
    {   var rox;
        var deffered = $q.defer();
         $http.get('/config/config.json').then(function (data)
         {
                deffered.resolve(data);
         });

         this.getPlayers = function ()
            {
                return deffered.promise;
            }
    })
})();

文件:siteService.js

(function() {
     var confUrl;
    angular.module('siteModule')
    .service('siteService', function ($http, $q, loggerService) 
    {

         loggerService.getPlayers().then(function (data) {
            confUrl = data.data.baseUrl+data.data.urls.site;
            console.log("GOTURL",confUrl);

         });

        this.bannerSlides = function(){
              console.log("URL NOT GET",confUrl);
             return $http({
                method: "GET",
                dataType: "json",
                url: confUrl
             }).then(function (response) {
                 // inspect/modify the received data and pass it onward
                 return response.data;
             }, function (error) {
 // inspect/modify the data and throw a new error or return data
                 throw error;
             });
        }
  })

})();

1 个答案:

答案 0 :(得分:1)

这是因为所有$http次呼叫都是异步的。你需要将你的承诺联系起来。首先从json中获取您的URL,然后调用它。也就是将loggerService.getPlayers()移到this.bannerSlides函数中。

在此之前,为什么在记录器服务中需要$q$http本身已经是一个承诺。

common.js:

(function() {
  angular.module('siteModule')
    .service('loggerService', function($http) {
      this.getPlayers = function() {
        return $http.get('/config/config.json')
      }
    })
})();

siteService.js:

(function() {
  var confUrl;
  angular.module('siteModule')
    .service('siteService', function($http, $q, loggerService) {
      this.bannerSlides = function() {
        loggerService.getPlayers().then(function(data) {
          confUrl = data.data.baseUrl + data.data.urls.site;
          console.log("GOTURL", confUrl);
          //move your return statement here 
          return $http({
            method: "GET",
            dataType: "json",
            url: confUrl
          })
        });
      }
    })
})();