Google JavaScript API: отлов ошибок HTTP

Ответ abraham на API Календаря Google: код 503 "Ошибка сервера" точно описывает мою ситуацию. Я получаю 503 в случайных местах при циклическом просмотре кода, который создает или удаляет записи календаря.

Однако я не могу понять, как последовать совету, который он цитирует в Google, который заключается в том, чтобы отловить ошибку и повторить транзакцию, используя экспоненциальный откат.

Код ниже представляет собой цикл, который помещает 8 новых событий в мой календарь. Он случайно сталкивается с 503 ошибками, которые вызываются из API Google вместо моего собственного кода. Много раз работает без ошибок.

Код Google API выполняется из моего цикла асинхронно, поэтому ни одно из действий Google фактически не выполняется, пока мой цикл не будет выполнен. try-catch блок, окружающий мой код, не срабатывает, когда асинхронный код выдает 503. Я не могу поставить 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)
    }
}

1 ответ

Экспоненциальный откат - это причудливый способ сказать, что при каждой попытке вы увеличиваете время ожидания экспоненциально, в течение определенного количества раз, прежде чем отказаться от запроса.

Реализация экспоненциального отката

Экспоненциальный откат - это стандартная стратегия обработки ошибок для сетевых приложений, в которой клиент периодически повторяет неудавшийся запрос в течение все большего промежутка времени. Если большой объем запросов или интенсивный сетевой трафик заставляет сервер возвращать ошибки, экспоненциальный откат может быть хорошей стратегией для обработки этих ошибок.

Вот демонстрационный код в 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(' - ');
}
Другие вопросы по тегам