Abraham对Google Calendar API : "Backend Error" code 503的回答完全描述了我的情况。在循环创建或删除日历条目的代码时,我在随机位置获得503s。
但是,我无法弄清楚如何遵循他从谷歌引用的建议,即抓住错误并使用指数退回重试交易。
下面的代码是一个循环,它将8个新事件放入我的日历中。它会随机出现503错误,这些错误是从Google API而不是我自己的代码中抛出的。很多时候它没有错误。
Google API代码从我的循环中异步运行,因此在我的循环完成之前,所有Google操作都不会实际执行。当异步代码抛出503时,我的代码周围的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)
}
}
答案 0 :(得分:1)
指数退避是一种奇特的方式,它说每次尝试都会在放弃请求之前以指数方式增加等待时间一段时间。
Implementing exponential backoff
指数退避是网络的标准错误处理策略 客户端定期重试失败请求的应用程序 越来越多的时间。如果请求量很大或者 繁重的网络流量导致服务器返回错误,指数级 退避可能是处理这些错误的好策略
这是demo code in JS可能会给你一个想法:
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(' - ');
}