我使用Facebook连接登录我的客户。 我想知道用户是否登录。 为此,我使用检查用户状态的服务。
我的服务:
angular.module('angularFacebbokApp')
.service('myService', function myService($q, Facebook) {
return {
getFacebookStatus: function() {
var deferral = $q.defer();
deferral.resolve(Facebook.getLoginStatus(function(response) {
console.log(response);
status: response.status;
}));
return deferral.promise;
}
}
});
我使用promise来获得结果,然后我使用$ q.when()来做其他的事情。
angular.module('angularFacebbokApp')
.controller('MainCtrl', function ($scope, $q, myService) {
console.log(myService);
$q.when(myService.getFacebookStatus())
.then(function(results) {
$scope.test = results.status;
});
});
我的问题是我需要在每个控制器中使用$ q.when。 有办法解决它吗?所以我可以将状态注入控制器? 我知道我可以使用解决方案,如果我使用路线,但我不认为它是最好的解决方案。
答案 0 :(得分:1)
根本不需要使用$q.defer()
和$q.when()
,因为Facebook.getLoginStatus()
已经返回了承诺。
您的服务可以像这样简化:
.service('myService', function myService(Facebook) {
return {
getFacebookStatus: function() {
return Facebook.getLoginStatus();
}
}
});
在你的控制器中:
.controller('MainCtrl', function ($scope, myService) {
myService.getFacebookStatus().then(function(results) {
$scope.test = results.status;
});
});
希望这有帮助。
答案 1 :(得分:0)
由于angularjs中的服务是单例,您可以创建新的var status
来缓存Facebook响应。之后,在您从控制器对Facebook进行新呼叫之前,您可以检查用户是否已登录或未检查myService.status
<强>服务强>
angular.module('angularFacebbokApp')
.service('myService', function myService($q, Facebook) {
var _status = {};
function _getFacebookStatus() {
var deferral = $q.defer();
deferral.resolve(Facebook.getLoginStatus(function(response) {
console.log(response);
_status = response.status;
}));
return deferral.promise;
}
return {
status: _status,
getFacebookStatus: _getFacebookStatus
}
});
<强> CONTROLLER 强>
angular.module('angularFacebbokApp')
.controller('MainCtrl', function ($scope, $q, myService) {
console.log(myService);
//not sure how do exactly check if user is logged
if (!myService.status.islogged )
{
$q.when(myService.getFacebookStatus())
.then(function(results) {
$scope.test = results.status;
});
}
//user is logged in
else
{
$scope.test = myService.status;
}
});