从resolve调用方法在服务中设置属性值(AngularJS)

时间:2016-11-24 15:51:17

标签: javascript angularjs

当我转到特定路线时,我想运行$ http请求并将结果存储在服务中的变量中。

因此,当我转到'/ users'路径时,我在解析中运行UsersFactory.getUsers()方法。我希望此方法运行$ http请求,返回一些用户,并将这些用户放入UsersFactory中的属性“this.usersObj”。

我想这样做,而不是做一些比较常见的事情:

getUsers: function(UsersFactory) { return UsersFactory.getUsers(); )

并在控制器中获取该数据

myApp.controller('UserController', function($scope, getUsers) {
  $scope.users = getUsers;
}

所以这就是我的尝试:

路线档案     ...

  .when('/users', {
    templateUrl: 'templates/page.html',
    controller : 'MyCtrl',
    resolve: {
         getUsers: ['UsersFactory', function(UsersFactory) {
           return UsersFactory.getUsers();

           // or just: UsersFactory.getUsers();
         }]
      }

...

myApp.factory('UsersFactory', 
['$http', '$q', function($http, $q) {

var self = this;

var getUsers = function() {
    function getUsersPromise() {
        var deferred = $q.defer();

        $http({
            method: 'GET',
            url: getFlashcardDecksURL
        })
        .then(function successCallback(response) {
            var users = response.data;
            deferred.resolve(users);
        }, function errorCallback() {
            deferred.reject('error msg');
        });

        return deferred.promise;
    }

    getUsersPromise()
    .then(function successCallback(users) {
        self.usersObj = users;
    })
    .catch(function errorCallback(errorMsg) {
        self.errorMsg = errorMsg;
    });     

};

var usersObj = [];

return {
  getUsers: getUsers,
  usersObj: usersObj,
}

... 

我的尝试无效。当我尝试在我的控制器中访问UsersFactory.usersObj时,它返回一个空数组。

2 个答案:

答案 0 :(得分:1)

问题似乎是您正在提取数据但从未将承诺返回到解决方案,或者从成功方法返回用户。尝试更改:

getUsersPromise()
.then(function successCallback(users) {
    self.usersObj = users;
})
.catch(function errorCallback(errorMsg) {
    self.errorMsg = errorMsg;
});

为:

return getUsersPromise()
.then(function successCallback(users) {
    self.usersObj = users;
    return self.usersObj;
})
.catch(function errorCallback(errorMsg) {
    self.errorMsg = errorMsg;
});

答案 1 :(得分:0)

试试这个:

function getUsers () {
  var deferred = $q.defer();

  $http({
    // Omitted
  })
  .then(function(res) {
    usersObj = res.data;           // Put in factory's property
    deferred.resolve(res.data);
  }, function(err) {
    deferred.reject(err)
  });

  return deferred.promise;
}

基本上,resolve会等待您的承诺得到解决。所以,只需返回承诺,resolve将完成其余的工作。