0

Abrahamさんの回答Google Calendar API : "Backend Error" code 503は私の状況を正確に表しています。私はカレンダーエントリを作成または削除するコードをループするときにランダムな場所に503を取得します。Google JavaScript API:HTTPエラーをキャッチ

しかし、彼がGoogleから引用したアドバイスに従う方法を理解することはできません。これは、エラーを捕捉し、指数関数的なバックオフを使用してトランザクションを再試行することです。

以下のコードは、8つの新しいイベントをカレンダーに入れるループです。ランダムに503のエラーが発生し、これは自分のコードではなくGoogle APIからスローされます。何度もエラーなく動作します。

Google APIコードは自分のループから非同期で実行されるため、ループが完了するまで実際にGoogleのアクションは実行されません。私のコードを囲むtry-catchブロックは、非同期コードが503をスローするときには起動しません。なしで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

ありがとうございます。私は自分の懸念をうまく表現していないようです。私は指数バックアップを理解しています...しかし、私は怠惰な、非同期スレッドでHTTP呼び出しのために503をキャッチする方法を理解していません。 ループ内に10個の新しいカレンダーイベントを挿入し、日付を増やしたとします。ループスレッドがアイドルになる前の3つすべての挿入に対するコールバック関数。 HTTPイベントの非同期スレッドが実行され、おそらくそのうちの1つが503をスローします。しかし、私のコードはそれを検出する方法がありません。私は約束のバージョンのリクエストを試みましたが、驚くべきことにそこには喜びはありません。 – WesR

+0

上記のコメントの編集方法はわかりませんが、訂正に気付きました。 "すべてのTHREEインサートのコールバック関数"は "すべてのTENインサートのコールバック関数" – WesR

関連する問題