$ http调用将数据传递给其他文件中的其他$ http调用

时间:2017-01-12 09:42:12

标签: javascript angularjs http synchronization angular-services

我想从一个json文件中读取URL并将URL提供给具有$ http GET请求的其他javascript文件以执行该URL。我在另一个服务文件中使用一个服务来获取数据。每当我运行它时,它会在 bannerslides 函数的 url:属性中显示 undefined

common.js:

 (function() {
    angular.module('siteModule')
        .service('loggerService', function($http, $q) {
            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) {
      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
          })
        });
      }
    })
})();

3 个答案:

答案 0 :(得分:1)

此错误表示siteService.bannerSlides未被识别为承诺。当我查看您的代码时,您只需返回实际值。那么你需要的是siteService.bannerSlides中的回调。

Error code is angular.js:14324 TypeError: Cannot read property 'then' of undefined

<强> siteController.js

 // modify this to accept callback instead of using then
 siteService.bannerSlides(function (data) {
       console.log(data);
 })

<强> siteService.js

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

     //move your return statement here 
     $http({
            method: "GET",
            dataType: "json",
            url: confUrl
     }).then(function (response) {
           // inspect/modify the received data and pass it onward
           //console.log("MAke url", confUrl);

         // add this
         return callback(response.data);
       }, function (error) {
       // inspect/modify the data and throw a new error or return data
         throw error;
       });
    }); //loggerService
  }

答案 1 :(得分:0)

你能举一个关于plunker / jsfiddle的例子吗?

您不必使用带有$ http的延迟对象和$ q服务。

在loggerService中你可以做到

this.getPlayers = function() {
    return $http.get('/config/config.json').then(function(data) {
        return data;
    });
}

另外,如果你想在siteController.js中使用    的 siteService.bannerSlides()。然后 你应该在bannerSlides函数中做一个返回,所以它返回$ http / promise。

答案 2 :(得分:-1)

在Jquery简单的http GET jquery.getjson

$.getJSON( "ajax/test.json", function( data ) {
  var items = [];
  $.each( data, function( key, val ) {
    items.push( "<li id='" + key + "'>" + val + "</li>" );
  });

  $( "<ul/>", {
    "class": "my-new-list",
    html: items.join( "" )
  }).appendTo( "body" );
});