Javascript TypeError:无法读取属性';授权';AngularJS应用程序中未定义的

Javascript TypeError:无法读取属性';授权';AngularJS应用程序中未定义的,javascript,angularjs,Javascript,Angularjs,我使用的是一个带有代码的工厂,该代码从GoogleAPI获取日历事件数据。我有一个带有link函数的指令,它调用工厂服务,工厂服务运行函数从API获取日历事件数据。调用该服务时,出现以下错误:TypeError:无法读取未定义的属性“authorize”。有人能告诉我为什么我会犯这个错误吗?当我在控制台中记录“gapi”时,我可以看到“auth”对象属性,但仍然没有定义。我是否需要使用一些特殊的代码只用于角度?以下是我的服务和指令代码: 工厂: var CLIENT_ID = '72730428

我使用的是一个带有代码的工厂,该代码从GoogleAPI获取日历事件数据。我有一个带有link函数的指令,它调用工厂服务,工厂服务运行函数从API获取日历事件数据。调用该服务时,出现以下错误:TypeError:无法读取未定义的属性“authorize”。有人能告诉我为什么我会犯这个错误吗?当我在控制台中记录“gapi”时,我可以看到“auth”对象属性,但仍然没有定义。我是否需要使用一些特殊的代码只用于角度?以下是我的服务和指令代码:

工厂:

var CLIENT_ID = '727304281402-2r6jn1l2jutllr07nc5ngba9omfqjand.apps.googleusercontent.com';
var SCOPES = ["https://www.googleapis.com/auth/calendar.readonly"];

app.factory('getCalendar', ['$q', function($q){
return function checkAuth() {
    console.log("Getting Calendar Events");
    var deferred = $q.defer();

    gapi.auth.authorize({
        'client_id': CLIENT_ID,
        'scope': SCOPES.join(' '),
        'immediate': true
    }, handleAuthResult);

    function handleAuthResult(authResult) {
        if (authResult && !authResult.error) {
          loadCalendarApi();
          console.log("You are authorized");
        } else {
          console.log("Not authorized due to " + authResult.error);
        }
    }

    function loadCalendarApi() {

        gapi.client.load('calendar', 'v3', listUpcomingEvents);
    }

    function listUpcomingEvents () {

        var request = gapi.client.calendar.events.list({
            'calendarId': 'magadesign.com_3337343339303832393534@resource.calendar.google.com',
            'orderBy': 'startTime',
            'singleEvents': true,
            'timeMin': (new Date()).toISOString(),
            'showDeleted': false,
            'maxResults': 3
        });

        request.then(function(response){

            var results = response.result.items;

            if(results === 0 ) {
                console.log('There are no events');
            }
            else {
                deferred.resolve(results);
            }
        });
    }
    return deferred.promise;

}

}]);
指令链接功能

app.directive('meetings', [ 'getCalendar', '$timeout', function(getCalendar, $timeout){
  return {
    restrict: 'E',
    templateUrl: 'scripts/directives/meetings.html',
    link: function(scope){
        getCalendar().then(function(events){
            scope.meetings = events;

            $timeout(function() {
                getCalendar();
            }, 60 * 1000 * 4);
        });

    }
  }
}]);

尝试使用
if
检查
gapi
是否正确defined@CodeBean在我的问题中,我说过‘当我在控制台中记录“gapi”时,我可以看到“auth”对象属性。'gapi已定义,但由于某些原因,auth未定义,即使我可以看到它列为gapi的对象属性。当您尝试使用它时,可能没有加载对象。通常在使用异步调用$q服务时发生。在我尝试使用一个变量时发生了几次,该变量是在稍后执行的then()节中初始化的。但是当我调试时,值已经设置好了(因为当我到达断点时,then()已经被调用了),谢谢@Ammar。我在调用服务的指令链接函数中添加了一个超时,现在它可以工作了。你知道这方面的其他解决方法吗?还是这是最有效的方法?我应该改为使用Google API角度依赖关系吗?我没有使用Google API,但超时似乎不是一个优雅的解决方案,如果您的服务器花费的时间超过超时时间,它很容易崩溃。我想google api应该能够在返回结果时将您的函数注册为侦听器。在快速搜索之后,我发现一个人在angular中使用Google Api:尝试使用
if
检查
gapi
是否正确defined@CodeBean在我的问题中,我说过‘当我在控制台中记录“gapi”时,我可以看到“auth”对象属性。'gapi已定义,但由于某些原因,auth未定义,即使我可以看到它列为gapi的对象属性。当您尝试使用它时,可能没有加载对象。通常在使用异步调用$q服务时发生。在我尝试使用一个变量时发生了几次,该变量是在稍后执行的then()节中初始化的。但是当我调试时,值已经设置好了(因为当我到达断点时,then()已经被调用了),谢谢@Ammar。我在调用服务的指令链接函数中添加了一个超时,现在它可以工作了。你知道这方面的其他解决方法吗?还是这是最有效的方法?我应该改为使用Google API角度依赖关系吗?我没有使用Google API,但超时似乎不是一个优雅的解决方案,如果您的服务器花费的时间超过超时时间,它很容易崩溃。我想google api应该能够在返回结果时将您的函数注册为侦听器。在快速搜索之后,我发现一个人在这里使用Google Api: