0

AbrahamGoogle Calendar API : "Backend Error" code 503的回答正好描述了我的情況。在循環創建或刪除日曆條目的代碼時,我隨機獲得503個。Google JavaScript API:捕捉HTTP錯誤

但是,我無法弄清楚如何遵循他從Google引用的建議,這是爲了捕獲錯誤並使用指數退避重試交易。

下面的代碼是一個循環,將8個新事件放到我的日曆中。它會隨機體驗503錯誤,這些錯誤是由Google API而非我自己的代碼引發的。很多時候它沒有錯誤。

Google API代碼與我的循環異步運行,所以在我的循環完成之前,沒有任何Google操作實際執行。當異步代碼拋出503時,圍繞我的代碼的try-catch塊不會觸發。我不能在沒有try的情況下將catch放入回調函數中,這會縮小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': '[email protected]'}, 
    '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

指數退避是說,在每一次嘗試,你增加等待時間呈指數,對放棄請求之前一定次數的一種假想方式。

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(' - '); 
} 
+0

感謝您的支持。看來我沒有很好地表達我的關心。我瞭解指數備份......但我不明白如何捕捉503由於HTTP調用是在一個懶惰的異步線程。 假設您在一個循環中插入十個新的日曆事件,遞增日期。在循環線程空閒之前,所有三個插入的回調函數。然後,HTTP事件的異步線程將運行,也許其中一個會拋出503.但是我的代碼無法檢測到它。我已經嘗試了Promise版本的請求,但是,令人驚訝的是,那裏沒有喜悅。 – WesR

+0

我不知道如何編輯上面的評論,但我注意到一個更正。 「所有THREE插入的回調函數」應該是「所有TEN插入的回調函數」 – WesR