我有这个工厂

.factory('Users', function($http) {
  var users = [];

  return {
    getUsers: function() {
      return $http.get("data.json")
        .then(function(response) {
          users = response.data;
          return users;
        });
    },
    getUser: function(id) {
      for (i = 0; i < users.length; i++) {
        if (users[i].id == id) {
          return users[i];
        }
      }
      return null;
    }
  }
})


然后将数据加载到我的控制器中

.controller('SessionsCtrl', function($scope, Users) {
  $scope.users = Users.getUsers();
})


如果我console.log来自http请求的响应,则表示我正在获取数据,但是由于某种原因,范围数据将不会更新。

我看过控制器看起来像这样的例子

Users.getUsers().then(function(data) {
    $scope.users = data;
});


但据我了解,由于$http已经返回了承诺,因此我不需要这样做。我想念什么吗?我是否需要完全参与$q

最佳答案

这将起作用:

 getUsers: function() {
      return $http.get("data.json");
    },


和:

Users.getUsers().then(function(data) {
    $scope.users = data.data;
});


但是,您编写的内容将无法正常工作,仅因为您无法直接从稍后将完成的操作(例如$http调用)中返回结果。
这个问题:

 getUsers: function() {
      return $http.get("data.json")
        .then(function(response) {
          users = response.data;
          return users;
        });
    },


是在return users;行执行ajax调用时,它仍在进行中,什么都还没有返回,所以对于用户来说您什么也收不到。对于您要做什么,我将使用回调:

 getUsers: function(callback) {
        $http.get("data.json")
         .then(function(response) {
          users = response.data;
          callback(users);
        });
    },


用法:

Users.getUsers(function(data) {
    $scope.users = data;
});

10-06 14:13
查看更多