0

AbrahamGoogle Calendar API 的回答:“后端错误”代码 503准确描述了我的情况。在循环创建或删除日历条目的代码时,我在随机位置得到 503。

但是,我不知道如何遵循他从谷歌引用的建议,即捕捉错误并使用指数回退重试交易。

下面的代码是一个循环,它将 8 个新事件放入我的日历中。它随机遇到 503 错误,这些错误是从 Google API 而不是我自己的代码抛出的。很多时候它工作没有错误。

Google API 代码从我的循环中异步运行,因此在我的循环完成之前,Google 的任何操作都不会真正执行。当异步代码抛出 503 时,我的代码周围的try-catch块不会触发。我不能在没有 a 的情况下将 acatch放入回调函数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)
    }
}
4

1 回答 1

2

指数退避是一种奇特的说法,即在每次尝试时,您都会以指数方式增加等待时间,持续一定次数,然后再放弃请求。

实现指数退避

指数退避是网络应用程序的标准错误处理策略,其中客户端在越来越长的时间内定期重试失败的请求。如果大量请求或繁重的网络流量导致服务器返回错误,指数退避可能是处理这些错误的好策略

这是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(' - ');
}
于 2016-10-16T23:36:30.723 回答