我在Angular-Meteor中创建了一个应用程序,我想在我的服务中创建一些我可以在我的控制器中使用的功能。但是,这些函数使用$ meteor.subscribe函数,该函数查询数据库并返回回调。在我的控制器中,我想调用该函数并将其绑定到$ scope,但它返回undefined,因为回调还没有返回任何内容。有没有解决方案来保持服务中的代码?有什么提示吗?
一个例子:
服务
angular.module('GQ').service('AuthService', ['$meteor', function($meteor)
{
console.log('AuthService init')
this.getUserAuth = function() {
var user = {};
$meteor.subscribe('isAdmin').then(function(res){
//do database query...
//loop over returned values and do a check if query matches or not
// if it does match return true
// else return false
});
// then return the value
return user.isAdmin;
}
}]);
控制器
$scope.isAdmin = AuthService.getUserAuth();
console.log($scope.isAdmin) <--- undefined
答案 0 :(得分:2)
您可以使用角度承诺(official doc)。
您的服务示例:
ParsedChunk foobar( std::vector<Foo> bar, size_t* start_from) {
size_t& i = *start_from;
ParsedChunk result_so_far;
for (;i < bar.size(); i++) {
process_some_foo_and_update_chunk(result_so_far, bar[i]);
if (check_condition(? ? ?) {
return result_so_far;
}
}
}
在您的控制器中使用:
this.getUserAuth = function() {
var deferred = $q.defer();
var user = {};
$meteor.subscribe('isAdmin').then(function(res, err){
// ....
// just an example
if (!res.isAdmin) deferred.reject('not an admin');
if (err) deferred.reject(err);
else deferred.resolve(res);
});
return deferred.promise;
}