我有多个谷歌日历,我希望在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
以获取所有事件。
但是当我想要按顺序排列我的事件时(由于日历而使用开始日期)我必须对它们进行排序。
因为它的异步,我不知道如何收集所有事件然后对它们进行排序。任何想法如何做到这一点? (或同时请求来自多个日历的所有活动/致电?)
答案 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
}