在工厂使用$ http角度

时间:2014-08-26 17:04:14

标签: angularjs factory

我似乎在将json从我的工厂发送到控制器

时出现问题

这是我的工厂

 .factory("UserService", function($http) {
var LevelsHere;
$http.get("/assets/images/generated.json").success(function(data){
    LevelsHere = data;
    return LevelsHere;
});


    return {
        all: function() {
          return LevelsHere;
        },
        first: function() {
          return LevelsHere[0];
        }
      };
})

我只是想用这个工厂发送json对象(或者它的位)。我可以在http get里面调试console.log似乎抓住了json就好了。我似乎已经撞墙了,任何帮助都会非常感激。我希望所有广告的第一个功能都能正常运行。谢谢!

我首先通过使用json字符串对其上面的levelsHere进行硬编码来获得成功,例如var levelsHere = [{" stuff in here"}],但是当我将它移到$ http时它没有&# 39;工作。

3 个答案:

答案 0 :(得分:5)

由于您没有任何$watch来查看异步$http.get请求返回的值,因此更新后的值不可供消费者使用。当$http.get请求返回一个承诺时,您可以利用承诺并在then()中更新承诺成功的值,如下所示:

var app = angular.module('app', [])
.factory("UserService", function($http) {
    var LevelsHere = $http.get("https://api.github.com/users/mralexgray/repos")
               .success(function(data){
                 return data;
               });
    return {
        all: function() {
          return LevelsHere;
        }
      };
})  
.controller('controller', function(UserService, $scope){
    UserService.all().then(function(data){
        $scope.value = data;    
    });
})

<强> DEMO

答案 1 :(得分:0)

什么不能正常工作?我的猜测是你在这个工厂方法后立即得到了undefined,因为$ http使用了延迟对象

答案 2 :(得分:0)

您在异步调用完成之前返回LevelsHere。您的操作顺序如下:

  1. 致电http.get
  2. 返回all和first返回LevelsHere(即使http请求尚未完成)
  3. http get return json
  4. 成功回电火灾返回LevelsHere给任何人。
  5. 更好的方法是返回承诺:

    return $http.get("/assets/images/generated.json") 
    

    然后在您的控制器中,您可以通过调用success函数从promise获取值。如果您尝试在工厂中解析承诺并返回值,则控制器将尝试在从服务器返回之前使用该值。

    var promise = UserService()
    promise.success(function(data){
    // do something with data
    }