【问题标题】:Can google calendar api call return a promise inside angular factory?谷歌日历 api 调用可以在角度工厂内返回一个承诺吗?
【发布时间】:2016-04-28 07:03:40
【问题描述】:

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

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

这段代码取自谷歌calendar api,我试图在 angularjs 工厂中实现它,但我需要从 api 返回事件结果作为我返回事件的承诺,但我的内部没有任何反应页面。

【问题讨论】:

  • gapi.client.load(...) 等退货承诺?
  • 我认为他们都没有返回承诺,正如您在link中看到的那样
  • 如果返回值不是一个承诺,你总是可以使用 Angular $q 模块将它变成一个承诺。
  • @UriBrecher,是的,那是真的,但在这种情况下,fun1 正在调用 fun2,它正在调用其他函数,我不知道该怎么做才能让它工作...... ;(
  • @MaximShoustin,它没有返回承诺

标签: javascript angularjs promise google-calendar-api


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

    你可以承诺一切, 你需要什么(在我看来)是一个围绕 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')
          )
        ;    
      })
    ;

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-10-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-10-25
      • 1970-01-01
      相关资源
      最近更新 更多