当我转到特定路线时,我想运行$ 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时,它返回一个空数组。
答案 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
将完成其余的工作。