启动服务并将其注入所有控制器

时间:2014-08-09 13:28:44

标签: angularjs angular-services

我使用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。 有办法解决它吗?所以我可以将状态注入控制器? 我知道我可以使用解决方案,如果我使用路线,但我不认为它是最好的解决方案。

2 个答案:

答案 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;
     }
  });