Angular$http返回数据,但不返回'不适用于范围

Angular $http returns data but doesn't apply to scope

本文关键字:返回 不适用 适用于 范围 http 数据 Angular      更新时间:2024-03-12

在angular中,我有这个工厂的

.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;
});

您的getUsers函数仍然返回promise,因为它返回了$http.get的值。所以,是的,您分配给$scope.users的值是一个承诺。根据上面的示例,您必须处理将值设置为$scope.users的承诺:

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