2

当我尝试通过 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);
 });
}

然而,事实证明,所有事件都放在日历中的同一日期(实际上是数组 events[] 中的最后一个日期)。我相信这可能是因为请求是回调函数,但我不确定。

将不胜感激!

4

3 回答 3

5

如果要一次插入多个事件,则应使用批处理。

var batch = gapi.client.newBatch();
batch.add(gapi.client.calendar.events.insert({
    'calendarId': 'primary',
    'resource': events[0]
}));
batch.add(gapi.client.calendar.events.insert({
    'calendarId': 'primary',
    'resource': events[1]
}));
batch.add(gapi.client.calendar.events.insert({
    'calendarId': 'primary',
    'resource': events[2]
}));
            ......

batch.then(function(){
    console.log('all jobs done!!!')
});
于 2016-08-13T14:44:14.667 回答
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 闭包 - 简单实用示例

这是上面代码的一个更易于阅读的版本,它将所有处理转移到一个函数中:

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]);
}
于 2013-03-19T12:27:33.433 回答
0

如前所述,您需要使用批处理来添加多个事件

为什么要分批? 使用批处理 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!!!')
});
  }
于 2018-05-29T13:33:54.173 回答