2

JavaScript v3 API を使用して複数のイベントを Google カレンダーに追加しようとすると、問題が発生します。

エントリが次のようなイベントである配列があります。

newEvent = {
    "summary": response[i].name+" BDay!!",
    "start": {
      "dateTime": date
    },
    "end": {
      "dateTime": date
    }
  };

  events[i]=newEvent;

その後、イベントを追加するために Google カレンダー 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 に答える