2

这是创建数组的函数:

//retrieve calendar id's
function getCalendarId(){
    gapi.client.load('calendar', 'v3', function() {
        var request = gapi.client.calendar.calendarList.list();
        request.execute(function(resp) {
            var calendarID = [];
            for (var i = 0; i < resp.items.length; i++) {
                var ID = resp.items[i].id;
                var calendarSummary = resp.items[i].summary;
                var calendarLocation = resp.items[i].location;
                var calendarDescription = resp.items[i].description;
                if (calendarDescription && calendarDescription.indexOf("Resource Tracker") != -1) {
                        var index = calendarID.length;
                        calendarID[index] = ID;
                }//endif
            }//end for
            console.log(typeof calendarID);
            return calendarID;
        });//end request.execute function(resp)
    });//end client.load function
}//end getCalendarId

这是分配它的函数:

function submitEvents(numHorses){
   var startdate = $("#from").val();
   var enddate = $("#to").val();
   var horsetypes = [];
   var calid = [];
   console.log(typeof(calid));
   calid = getCalendarId();
   console.log(typeof(calid));
   for (i=0; i<numHorses;i++){
      horsetypes[i] = $( "#type"+i).val();
      addEvent(calid[i%calid.length], startdate, enddate, horsetypes[i]);
   }//end for           
  };//end submitEvents

当我检查类型时, calendarID 在返回之前是一个对象,当我声明它时 calid 是一个对象,但是当我进行赋值时 calid=getCalendarID(); calid 的类型变得未定义。

我的头撞墙已经有一段时间了;任何帮助表示赞赏!

4

2 回答 2

2

最外层的函数没有返回任何内容;它没有返回值,因此设置为函数返回值的变量设置为未定义。内部匿名函数包含return,它可能对 API 有意义,也可能没有意义(可能没有)。

真正的问题是对日历 API 的调用可能需要任意时间(它是异步的),因此您不能在单个(同步)函数中设置值并期望它能够工作。当您的请求进出远程服务器时,Javascript 不会停止执行,而您真的不希望它停止执行。

类似的问题/答案: javascript函数返回不起作用

由于您可能正在使用getCalendarId其他地方,因此您可以考虑让它具有自己的功能,并在 Google 日历函数返回时调用它:

function getCalendarId(callback){                            // !!!
  gapi.client.load('calendar', 'v3', function() {
    var request = gapi.client.calendar.calendarList.list();
    request.execute(function(resp) {
      var calendarID = [];
      for (var i = 0; i < resp.items.length; i++) {
        // omitted for brevity
      }//end for
      console.log(typeof calendarID);
      callback(calendarID);                                  // !!!
    });//end request.execute function(resp)
  });//end client.load function
}//end getCalendarId

function submitEvents(numHorses){
  // omitted for brevity
  getCalendarId(function(calid) {                            // !!!
    console.log(typeof(calid));
    for (i=0; i<numHorses;i++){
      // omitted for brevity
    }//end for
  });
};//end submitEvents
于 2012-10-31T06:04:20.970 回答
-1
//retrieve calendar id's
function getCalendarId(){
var calendarID = [];
    gapi.client.load('calendar', 'v3', function() {
        var request = gapi.client.calendar.calendarList.list();
        request.execute(function(resp) {

            for (var i = 0; i < resp.items.length; i++) {
                var ID = resp.items[i].id;
                var calendarSummary = resp.items[i].summary;
                var calendarLocation = resp.items[i].location;
                var calendarDescription = resp.items[i].description;
                if (calendarDescription && calendarDescription.indexOf("Resource Tracker") != -1) {
                        var index = calendarID.length;
                        calendarID[index] = ID;
                }//endif
            }//end for
            console.log(typeof calendarID);

        });//end request.execute function(resp)
    });//end client.load function
return calendarID;
}//end getCalendarId

这应该有效。CalenderID应该为被调用的外部函数声明。在您的代码中,您正在返回calenderID另一个函数,该函数是load

于 2012-10-31T06:06:03.703 回答