2013-03-18 2 views
1

У меня возникла проблема, когда я пытаюсь добавить несколько событий в Календарь Google через javascript v3 api.Google Calendar javascript api - Добавить несколько событий

У меня есть массив, какие элементы являются события, подобные этим:

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); 
}); 
} 

Однако выясняется, что все события помещаются в одну дату в календарь (что фактически является последней датой в событиях массива []). Я считаю, что это может быть потому, что запросы являются функциями обратного вызова, но я не уверен.

Поблагодарили бы за помощь!

ответ

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]); 
} 
+0

Спасибо, это помогло, по крайней мере, больше узнать о закрытии и ограничении переменных в javascript. Тем не менее, я исправил проблему только после того, как связал события [j] в цикле, а также потому, что я не создавал новую дату для каждого созданного события, вместо этого я только обновлял одну и ту же переменную каждый цикл и по какой-то причине не работает должным образом. В любом случае, еще раз спасибо! – gpestana

3

Если вы хотите вставлять сразу несколько событий, вы должны использовать пакет.

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!!!') 
}); 
Смежные вопросы