Google JavaScript API:捕获HTTP错误

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块不会触发。我不能在回调

他的回答正好描述了我的情况。当循环创建或删除日历条目的代码时,我在随机位置得到503个

然而,我不知道如何遵循他从谷歌引用的建议,即捕捉错误并使用指数退避重试事务

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

GoogleAPI代码从我的循环异步运行,因此在我的循环完成之前,没有任何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)
    }
}
/*适用于全天谷歌日历事件的特殊日期字符串格式。
时区独立。
*/
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,但令人惊讶的是,它没有带来任何乐趣。我不知道如何编辑上面的评论,但我注意到了一个更正。“所有三个插入的回调函数”应“所有十个插入的回调函数”