2017-12-18 24 views
2

はじめに:私はC++バックグラウンドから来た後、Javascriptの方が新しいです。NodeJS/ES6で失敗した試行を再試行

パブリックnpmライブラリを使用していくつかのデータセットをリクエストするNodeJSアプリケーションを作成しています。データソースレートは要求を制限し、極端な場合にはこれらのレート制限が適用されます。これらの制限に達すると、APIは数多くのリクエストを処理する前に「レート制限超過」を数秒間だけ戻します。

私はデータを受け取ったときに、.map()を使って解析しようとします。しかし、レート制限を超えると、map()は配列に対してのみ利用可能で、「レート制限超過」というメッセージは単なるオブジェクトなので、アプリケーション全体がクラッシュする。

if (message.message === 'Rate limit exceeded') { //This check doesn't work btw 
    console.log('There was a problem parsing data from the server: ' + err); 
    return; 
    } 

    var items = data.map(item => ({ 
     time: new Date(item[0] * 1000), 
     low: item[1], 
     high: item[2], 
     open: item[3], 
     close: item[4], 
     volume: Number(item[5]) 
    })); 

    for(var i = 0; i < items.length; i++) 
     dataStore.push(items[i]); 

「レート制限超過」メッセージを検出して数秒待ってから再試行することで、このアプローチにしたいと考えています。

私の現在の理解から、setTimeout()はこれの良い候補になりますが、再帰的に動作させる方法を理解できません。基本的には、データが正しく処理されるまで5秒ごとにデータを再要求したいと思います。

TL; DR:関数がデータを正しく受け取るまで、setTimeout()で関数を再帰的に呼び出そうとします。これを達成するより良い方法があれば、私はすべての耳です。

答えて

1

setInterval()を使用して、n秒ごとにチェックし続けています。データを取得したらをclearInterval()で終了することができます。

このコンテキストでは、特定のNPMパッケージを使用してデータを要求しているかどうかわからないので、ここではjQueryを使用しています。今のよう

let retryAfter = 10000; //10 seconds 
 

 
setInterval(function fetchData() { 
 
    $.get('//api.jsonbin.io/b/5a3823a38aaf400a97709c43', (data) => { 
 
    
 
    // Keep on retrying 
 
    console.log(data); 
 

 
    // If you get the data, just exit the setInterval 
 
    if(data) { 
 
     clearInterval(fetchData); 
 
    } 
 
    }); 
 
}(), retryAfter); 
 

 
//() brackets here is to execute the function without the first 10 sec delay
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>

それが最初でデータを取得するように、この例では、私のsetInterval()は一度だけ実行されます。しかし、あなたの例では、データを受け取るまで実行されます。

また、エラーメッセージを返すAPIがJSONまたはプレーンテキストの形式であるかどうかわからないため、あなたのエラーメッセージを比較する方法を提案することはできません。応答データ型に基づいてエラーメッセージを比較する方法によって異なります。

関連する問題