从$ http promise中刷新返回的数据

时间:2014-12-26 21:10:13

标签: javascript angularjs mongodb rest

我使用restful api从mongodb访问json数据,我构建了angularjs工厂如下:

angular.module('myApp').
factory('usersFactory', function($http, $q){
 var deffered = $q.defer();

return {
getUsers: function(){
return $http.get('/api/users/').then(function(result){ deffered.resolve(result);  return deffered.promise; });
},

getUser: function(nickname){
return $http.get('/api/users/'+nickname).then(function(result){ deffered.resolve(result);  return deffered.promise; });
}
};
}).
controller('MainCtrl', function($scope, usersFactory){
  var promise = usersFactory.getUsers();
  promise.then(function(response){
        //success handler
        $scope.users= response.data;
      },
      function(response){
        //error handler
        $log.error(response);
      });
}).
controller('SecondCtrl', function($scope, usersFactory){
  $scope.loadUser = function(){
    var promise = usersFactory.getUsers($scope.usersFld);
  promise.then(function(response){
        //success handler
        $scope.user= response.data;
      },
      function(response){
        //error handler
        $log.error(response);
      });
};

});

当我更改用户时,第一个用户显示数据的问题在我进行硬刷新(F5)之前不会显示,有人可以解释为什么会发生这种情况吗?并且数据是否被缓存,所以我需要进行硬刷新以显示新数据?

2 个答案:

答案 0 :(得分:1)

您不能重复使用延期。您应该会看到对loadUser()的调用会立即返回,因为承诺已经解决,$scope.user应该是您初次调用getUsers()的结果,因为这就是它的原因解决了。​​

您可以将var deferred = $q.defer();移至getUsers()getUser()函数并直接返回承诺,或只返回$http.get的结果,不要打扰创建自己的延期。

getUsers: function() {
    var deferred = $q.defer();
    $http.get('/api/users/').then(function(result) {
        deferred.resolve(result);
    }, function(error) {
        deferred.reject(error);
    });
    return deferred.promise; // result will be what you call resolve() with
},

getUser: function(nickname){
    return $http.get('/api/users/'+nickname);
}

答案 1 :(得分:0)

您可以使用观看事件,然后从那里激活您的ajax电话。 [根据数据集的大小,您可以通过第一次调用获得所需的用户数据,然后您只需执行一次$ http获取。]

//my suggestion if the dataset is not to big
//$scope.Users = ajax call getting all user data
//var index = 'find index of user by ...'
//$scope.User = $scope.Users[index]     


controller('SecondCtrl', function($scope, usersFactory){
    scope.$watch("usersFld", function (newValue, oldValue) {
        $scope.loadUser = function(){
            var promise = usersFactory.getUsers($scope.usersFld);
            promise.then(function(response){
            //success handler
            $scope.user= response.data;
        },
        function(response){
        //error handler
        $log.error(response);
        });
      }; 
   });