显示多个Google日历中的所有活动

时间:2018-02-10 18:28:14

标签: javascript google-calendar-api

我有多个谷歌日历,我希望在javascript上使用谷歌日历api在单个列表中显示(例如在谷歌日历ui上)。

official google calendar api doc非常好。主要剪辑如下:

function listUpcomingEvents() {
    gapi.client.calendar.events.list({
      'calendarId': 'primary',
      'timeMin': (new Date()).toISOString(),
      'showDeleted': false,
      'singleEvents': true,
      'maxResults': 10,
      'orderBy': 'startTime'
    }).then(function(response) {
      var events = response.result.items;
      appendPre('Upcoming events:');

      if (events.length > 0) {
        for (i = 0; i < events.length; i++) {
          var event = events[i];
          var when = event.start.dateTime;
          if (!when) {
            when = event.start.date;
          }
          appendPre(event.summary + ' (' + when + ')')
        }
      } else {
        appendPre('No upcoming events found.');
      }
    });
  }

由于我有多个日历,我显然必须用我的多个日历ID替换'calendarId': 'primary'请求。为了获得各种ID,它也很简单。 e.g:

function listCalendars() {
    gapi.client.calendar.calendarList.list({

    }).then(function(response) {
      var calendars = response.result.items;
      console.log(calendars);
    });
  }

由于上面提到的'calendarId': 'primary'只接受一个值(而不是列表),我必须多次调用端点gapi.client.calendar.events.list以获取所有事件。

但是当我想要按顺序排列我的事件时(由于日历而使用开始日期)我必须对它们进行排序。

因为它的异步,我不知道如何收集所有事件然后对它们进行排序。任何想法如何做到这一点? (或同时请求来自多个日历的所有活动/致电?)

1 个答案:

答案 0 :(得分:0)

我可以使用的一件事是Promises

可能的解决办法是:

function callAllCalendars() {
   var promises = []
   var calendarIdList = ["calendar1", "calendar2", "calendar3"];
   for(var i = 0; i < calendarIdList .length, i++){
      promises.push(createCalendarPromise(calendarIdList [i]));
   }
   $.when.apply($, promises).done(function () {
      ... Your code to do the sorting ...
   });

}

function createCalendarPromise(calendarId) {
   var dfd = $.Deferred();
   gapi.client.calendar.events.list({
        'calendarId': calendarId,
         ... Your code...
   }).then(function(response) {
      ... Your Code, push events to a global list...
      dfd.resolve();
  }).fail(function() { dfd.resolve();});

  return dfd.promise
}