Google日历javascript api - 添加多个活动

时间:2013-03-18 21:25:10

标签: javascript google-api google-calendar-api

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

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

非常感谢帮助!

2 个答案:

答案 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!!!')
});
  }