谷歌日历 api 调用可以在角度工厂内返回承诺吗?

Can google calendar api call return a promise inside angular factory?

本文关键字:工厂 返回 承诺 api 日历 调用 谷歌      更新时间:2023-09-26

我可以更改此代码以返回承诺吗?

var calApi = {
fun3: function() {
    gapi.auth.authorize(
      {
        'client_id': CLIENT_ID,
        'scope': SCOPES.join(' '),
        'immediate': true
      }, calApi.fun2);
},
fun2: function(authResult) {
    if (authResult && !authResult.error) {
        calApi.fun4();
    }
},
fun1: function(event) {
    gapi.auth.authorize(
        {client_id: CLIENT_ID, scope: SCOPES, immediate: false},
        calApi.fun2);
    return false;
},
fun4: function() {
    gapi.client.load('calendar', 'v3', calApi.fun5);
}, 
fun5: function() {
    // some code
    // returning the result...
}
};
return calApi;

我的控制器:

$scope.hanleAPICall = function(event) {
    factoryName.fun1(event);
};

这段代码取自谷歌日历 API,我试图在 AngularJS 工厂中实现它,但我需要从 API 返回事件的结果作为承诺,因为 IM 返回事件,但我的页面内什么也没发生。

您可以执行以下操作来返回服务中的承诺:

angular.module('app', [])
 .factory('AppService', function ($q) {
   return {
     fun3: fun3
   };
  function fun3() {
    var defer = $q.defer();
    gapi.auth.authorize(
      {
        'client_id': CLIENT_ID,
        'scope': SCOPES.join(' '),
        'immediate': true
      }, handleAuthResult);
    function handleAuthResult (authResult) {
      if (authResult && !authResult.error) {
        defer.resolve(authResult);
      } else {
        defer.reject(authResult.error);
      }
    }
    return defer.promise;
  }
});

与上面类似,您可以为其他方法创建工厂方法fun1, fun2, fun4, fun5

你可以承诺一切,你需要的(在我看来)是围绕gapi库的包装器,仅此而已。

马上:

  1. 避免全局变量,创建两个常量(GAPI_CLIENT_ID、GAPI_SCOPES)
  2. 创建一个[Service][1],它以棱角分明的方式执行gapi所做的事情。

这应该是对代码的一点重构......

function GapiServiceFactory($q, GAPI_CLIENT_ID, GAPI_SCOPES) {
  var self = this;
  
  /**
   * @private
  **/
  self._authorize = function(immediate) {
    var deferred = $q.defer();
    var data = {
      client_id: GAPI_CLIENT_ID, 
      scope: GAPI_SCOPES, 
      immediate: !!immediate
    };
    
    gapi.auth.authorize(data, function(result) {   
      if(Object.hasOwnProperty.call(result, 'error')) {
        return deferred.reject(result);
      }
      
      return deferred.resolve(result);
    });
    
    return deferred.promise;
  };
  
  self.authorize = function() {
    return self._authorize(false);
  };
  
  self.authorizeImmediate = function() {
    return self._authorize(true);
  };
  
  self.loadCalendar = function() {
    var deferred = $q.defer();
    
    gapi.client.load('calendar', 'v3', function() {
      
      if(/**What's the logic here? **/) {
        return deferred.reject();
      }
      
      return deferred.resolve();
    });
    return deferred.promise;
  };
}
angular
  .module('Test', [])
  .constant('GAPI_CLIENT_ID', 12333)
  .constant('GAPI_SCOPES', ['read', 'write'])
  .service('GapiService', GapiServiceFactory)
  .controller('TestCtrl', function TestCtrl(GapiService) {
    GapiService
      .authorizeImmediate()
      .then(
        console.log.bind(console, 'Authorization success'), 
        console.log.bind(console, 'Authorization error')
      )
    ;
  
    GapiService
      .loadCalendar()
      .then(
        console.log.bind(console, 'LoadCalendar success'), 
        console.log.bind(console, 'LoadCalendar error')
      )
    ;    
  })
;