Google JavaScript API:捕获HTTP错误
他的回答正好描述了我的情况。当循环创建或删除日历条目的代码时,我在随机位置得到503个 然而,我不知道如何遵循他从谷歌引用的建议,即捕捉错误并使用指数退避重试事务 下面的代码是一个循环,将8个新事件放入我的日历中。它随机遇到503个错误,这些错误是从GoogleAPI而不是我自己的代码中抛出的。很多时候,它可以正常工作 GoogleAPI代码从我的循环异步运行,因此在我的循环完成之前,没有任何Google操作实际执行。异步代码抛出503时,围绕我的代码的Google JavaScript API:捕获HTTP错误,javascript,google-api,google-calendar-api,http-error,exponential-backoff,Javascript,Google Api,Google Calendar Api,Http Error,Exponential Backoff,他的回答正好描述了我的情况。当循环创建或删除日历条目的代码时,我在随机位置得到503个 然而,我不知道如何遵循他从谷歌引用的建议,即捕捉错误并使用指数退避重试事务 下面的代码是一个循环,将8个新事件放入我的日历中。它随机遇到503个错误,这些错误是从GoogleAPI而不是我自己的代码中抛出的。很多时候,它可以正常工作 GoogleAPI代码从我的循环异步运行,因此在我的循环完成之前,没有任何Google操作实际执行。异步代码抛出503时,围绕我的代码的try-catch块不会触发。我不能在回调
try-catch
块不会触发。我不能在回调函数中放入catch
而不使用try
,这将缩小catch
的范围,从而排除Google的代码
有什么建议吗
/* Special date string format for all-day Google Calendar events.
Time zone independent.
*/
Date.prototype.yyyy_mm_dd = function() {
var yyyy= this.getFullYear().toString();
var mm = (this.getMonth()+101).toString().slice(-2); //get leading 0
var dd = (this.getDate()+100).toString().slice(-2);
return yyyy+'-'+mm+'-'+dd;
}
var fastevent = {
'summary': 'Fast',
'organizer': {
'self': true,
'displayName': 'Wes Rishel',
'email': 'wrishel@gmail.com'},
'start': {'date': 'zzzz'}, // filled in for each instance
'end': {'date': 'zzzz'},
'colorId': '11',
}
function addFastEvents() {
try {
var eventDate = calendar.getLastFastDate() || new Date;
for (var eventCount = 0; eventCount < 8; eventCount++) {
// advance to next Tuesday or Friday
eventDate=eventDate.addDays(
[2, 1, 3, 2, 1, 4, 3][eventDate.getDay()]
);
fastevent.start.date = eventDate.yyyy_mm_dd();
fastevent.end.date = fastevent.start.date;
var request = gapi.client.calendar.events.insert({
'calendarId': 'primary',
'resource': fastevent
});
request.execute(function(fastevent) {});
calendar.getPage(eventDate);
calendar.setCellStyle(eventDate, 'fastingweekdaydata');
} // for
} catch(e) {
p(e.message, e.name)
}
}
/*适用于全天谷歌日历事件的特殊日期字符串格式。
时区独立。
*/
Date.prototype.yyyy\u mm\u dd=函数(){
var yyyy=this.getFullYear().toString();
var mm=(this.getMonth()+101.toString().slice(-2);//获取前导0
var dd=(this.getDate()+100.toString().slice(-2);
返回yyyy+'-'+mm+'-'+dd;
}
var fastevent={
“摘要”:“快速”,
“组织者”:{
“自我”:真实,
'displayName':'Wes Rishel',
“电子邮件”:wrishel@gmail.com'},
'start':{'date':'zzzz'},//为每个实例填写
'end':{'date':'zzzz},
“colorId”:“11”,
}
函数addFastEvents(){
试一试{
var eventDate=calendar.getLastFastDate()| |新日期;
对于(var eventCount=0;eventCount<8;eventCount++){
//提前到下周二或周五
eventDate=eventDate.addDays(
[2,1,3,2,1,4,3][eventDate.getDay()]
);
fastevent.start.date=eventDate.yyyyy_mm_dd();
fastevent.end.date=fastevent.start.date;
var request=gapi.client.calendar.events.insert({
'日历ID':'主要',
“资源”:fastevent
});
执行(函数(fastevent){});
calendar.getPage(eventDate);
calendar.setCellStyle(eventDate,“fastingweekdaydata”);
}//为了
}捕获(e){
p(e.信息,e.姓名)
}
}
指数退避是一种奇特的说法,表示在每次尝试时,您都会以指数方式增加等待时间,在放弃请求之前等待一定次数
指数退避是一种标准的网络错误处理策略
客户端定期重试失败请求的应用程序
在越来越多的时间里。如果大量请求或
严重的网络流量会导致服务器返回错误,如指数级错误
退避可能是处理这些错误的好策略
下面是一个可能给你一个想法的例子:
console.log = consoleLog;
exponentialBackoff(sometimesFails, 10, 100, function(result) {
console.log('the result is',result);
});
// A function that keeps trying, "toTry" until it returns true or has
// tried "max" number of times. First retry has a delay of "delay".
// "callback" is called upon success.
function exponentialBackoff(toTry, max, delay, callback) {
console.log('max',max,'next delay',delay);
var result = toTry();
if (result) {
callback(result);
} else {
if (max > 0) {
setTimeout(function() {
exponentialBackoff(toTry, --max, delay * 2, callback);
}, delay);
} else {
console.log('we give up');
}
}
}
function sometimesFails() {
var percentFail = 0.8;
return Math.random() >= 0.8;
}
function consoleLog() {
var args = [].slice.apply(arguments);
document.querySelector('#result').innerHTML += '\n' + args.join(' - ');
}
指数退避是一种奇特的说法,即在每次尝试时,您都会以指数方式增加等待时间,在放弃请求之前等待一定次数 指数退避是一种标准的网络错误处理策略 客户端定期重试失败请求的应用程序 在越来越多的时间里。如果大量请求或 严重的网络流量会导致服务器返回错误,如指数级错误 退避可能是处理这些错误的好策略 下面是一个可能给你一个想法的例子:
console.log = consoleLog;
exponentialBackoff(sometimesFails, 10, 100, function(result) {
console.log('the result is',result);
});
// A function that keeps trying, "toTry" until it returns true or has
// tried "max" number of times. First retry has a delay of "delay".
// "callback" is called upon success.
function exponentialBackoff(toTry, max, delay, callback) {
console.log('max',max,'next delay',delay);
var result = toTry();
if (result) {
callback(result);
} else {
if (max > 0) {
setTimeout(function() {
exponentialBackoff(toTry, --max, delay * 2, callback);
}, delay);
} else {
console.log('we give up');
}
}
}
function sometimesFails() {
var percentFail = 0.8;
return Math.random() >= 0.8;
}
function consoleLog() {
var args = [].slice.apply(arguments);
document.querySelector('#result').innerHTML += '\n' + args.join(' - ');
}
谢谢你。看来我没有很好地表达我的担忧。我了解指数备份。。。但我不明白如何捕获503,因为HTTP调用位于一个懒惰的异步线程中。假设在循环中插入十个新的日历事件,增加日期。循环线程空闲前所有三个插入的回调函数。然后HTTP事件的异步线程将运行,其中一个可能会抛出503。但我的代码无法检测到它。我尝试过Promise版本的request,但令人惊讶的是,它没有带来任何乐趣。我不知道如何编辑上面的评论,但我注意到了一个更正。“三次插入的回调函数”应该是“十次插入的回调函数”,谢谢。看来我没有很好地表达我的担忧。我了解指数备份。。。但我不明白如何捕获503,因为HTTP调用位于一个懒惰的异步线程中。假设在循环中插入十个新的日历事件,增加日期。循环线程空闲前所有三个插入的回调函数。然后HTTP事件的异步线程将运行,其中一个可能会抛出503。但我的代码无法检测到它。我尝试过Promise版本的request,但令人惊讶的是,它没有带来任何乐趣。我不知道如何编辑上面的评论,但我注意到了一个更正。“所有三个插入的回调函数”应“所有十个插入的回调函数”