reactjs - 将多个事件插入谷歌日历
问题描述
我需要一次将 120 个事件从用户插入到 google calander 我有 React 应用程序,并从中在 120 个不同日期创建相同提醒的 120 个副本。
我想将它们添加到压延机中并使用import { gapi } from 'gapi-script'
我尝试像这样单独发送事件:
var event = {
'summary': nameValue.toString(),
'description': ReminderTextValues.toString(),
'start': {
'date': ISODateString(javasScriptDate)
},
'end': {
'date': ISODateString(NextDate)
},
'reminders': {
'useDefault': false,
'overrides': [
{'method': "email", 'minutes': 24 * 60},
{'method': "popup", 'minutes': 30}
]
}
}
var request = gapi.client.calendar.events.insert({
'calendarId': 'primary',
'resource': event,
})
request.execute(event => {
console.log("Executed:", event)
})
即使我从 120 事件中只有 100 个返回403
(这是一个不同的问题)在日历中,我也看到实际上只有 1 个被添加。
我也尝试这样使用batch
:
// we will submit all the request in a 1 batch
var batch = gapi.client.newBatch();
// We will save the eevnt for the next 120 years
for (var startYear = HebrewDateEnteredByTheUser.year; startYear< (HebrewDateEnteredByTheUser.year+120); startYear++ )
{
// JS date
const javasScriptDate = new Date(day, month, startYear).addHours(1);
const NextDate = javasScriptDate.addHours(22);
// Google event
var event = {
'summary': nameValue.toString(),
'description': ReminderTextValues.toString(),
'start': {
'date': ISODateString(javasScriptDate)
},
'end': {
'date': ISODateString(NextDate)
},
'reminders': {
'useDefault': false,
'overrides': [
{'method': "email", 'minutes': 24 * 60},
{'method': "popup", 'minutes': 30}
]
}
}
batch.add(gapi.client.calendar.events.insert({
'calendarId': 'primary',
'resource': event,
}));
然后在循环运行后:
batch.then(function(){
console.log('all jobs done!!!')
});
在此之后我没有收到任何错误,并且在我看到的领事馆中,all jobs done!!!
但是当我检查日历时,我只能找到前 5 个事件,其余的都被忽略了......
如何一次将 120 个事件插入谷歌日历?
解决方案
您的症状与“超出 403 速率限制”错误一致。您将需要限制您的请求。前 20 个通常是可以的,但之后您需要将速度减慢到大约每 1.5 秒一个请求。不要使用 Batch,因为 a) 它已被弃用,b) 它使问题变得更糟。
我使用的方法是将所有请求放在内存队列(我使用数组)上,然后有一个单独的例程,它以每 x 秒一个的速率将项目出列。任何失败都会简单地留在队列中并重试。我的算法有点启发式,因为它逐渐提高速度直到达到 304,然后减慢到 2 秒的间隔。
推荐阅读
- java - 如何在 Java 中只关注 JSON 文件中的某种类型的数据?
- android - Android(Xamarin)通过存储访问框架 Uri 导航文件夹树
- sublimetext3 - 如何在 Sublime Text 3 中的 Windows 上使用“open_files_in_new_window”
- python - 不能在 Python OpenCV v4.20 中使用 SIFT
- flutter - Flutter - 创建一个 Widget 扩展具有特定值的 TextField
- c# - SQL 连接期间 Xamarin Android 应用程序中缺少 dll System.Net.Security.Native
- javascript - 在浏览器中启用或禁用地理定位时触发事件
- logging - 从 Web 应用程序登录到 Stackdriver
- android - google-services.json firebase 通知反应原生 android - 一个应用程序无法正常工作
- c# - 使用 TransportWithMessageCredential 替换旧版 WCF 应用程序使用的 Web 服务器