当我尝试通过javascript v3 api向Google日历添加多个事件时,我遇到了一个问题。
我有一个数组,其中的条目是这样的事件:
newEvent = { "summary": response[i].name+" BDay!!", "start": { "dateTime": date }, "end": { "dateTime": date } }; events[i]=newEvent;
之后,我打电话给Google Calendar api以添加活动:
var request;
for(var j = 0; j<events.length; j++) {
console.log(events[j]);
request = gapi.client.calendar.events.insert({
'calendarId': calendarId,
'resource': events[j]
});
request.execute(function(resp) {
console.log(resp);
});
}
然而,事实证明,所有事件都放在日历中的同一日期(实际上是数组事件[]中的最后一个日期)。我相信这可能是因为请求是回调函数,但我不确定。
非常感谢帮助!
答案 0 :(得分:3)
events[j]
正在for循环的每次迭代中反弹。尝试使用匿名函数绑定到正确的事件:
var request;
for(var j = 0; j<events.length; j++) {
console.log(events[j]);
request = function(resource) { // Function that returns a request.
return gapi.client.calendar.events.insert({
'calendarId': calendarId,
'resource': resource
});
}(events[j]); // Bind to the current event.
request.execute(function(resp) {
console.log(resp);
});
}
有关JavaScript数组和闭包的更多详细信息,请参阅以下问题:JavaScript closure inside loops – simple practical example
以上是一个易于阅读的上述代码版本,它将所有处理转移到一个函数中:
var makeRequest = function(resource) {
console.log(resource);
var request = gapi.client.calendar.events.insert({
'calendarId': calendarId,
'resource': resource
});
request.execute(function(resp) {
console.log(resp);
});
};
for(var j = 0; j<events.length; j++) {
makeRequest(events[j]);
}
答案 1 :(得分:0)
作为soredive,提到,你需要使用批处理来添加多个事件
为什么要批处理? 使用批处理API的主要原因是减少网络开销,从而提高性能。
示例:强>
createMultipleEvents() {
const events = [ {
'summary': 'sample test events1',
'location': 'coimbatore',
'start': {
'date': '2018-08-29',
'timeZone': 'America/Los_Angeles'
},
'end': {
'date': '2018-08-29',
'timeZone': 'America/Los_Angeles'
}
},
{
'summary': 'sample test events2',
'location': 'coimbatore',
'start': {
'date': '2018-08-29',
'timeZone': 'America/Los_Angeles'
},
'end': {
'date': '2018-08-29',
'timeZone': 'America/Los_Angeles'
}
},
];
const batch = gapi.client.newBatch();
events.map((r, j) => {
batch.add(gapi.client.calendar.events.insert({
'calendarId': 'primary',
'resource': events[j]
}))
})
batch.then(function(){
console.log('all jobs now dynamically done!!!')
});
}