2016-10-22 22 views
0

私はまだES6で初心者です。 私はあなたがhttp(s)リクエストを送信するときのロジックでhttp(s)リクエストを送信する関数を作成しようとしています。 5つ以上の進行中のリクエストがある場合は、 が完了するまで待つ必要があり、次のリクエストを処理できます。 応答コードが200でない場合は、3回再試行する必要があります。応答コードが の3回の再試行がまだ200でない場合は、エラー関数を実行する必要があります。 また、応答のボディのJSONデータを関数の引数として受け取ってください。ES6非同期の約束

function httpGet(url) { 
    return new Promise(
     function (resolve, reject) { 
      const request = new XMLHttpRequest(); 
      request.onload = function() { 
       if (this.status === 200) { 
        // Success 
        resolve(this.response); 
       } else { 
        // Something went wrong (404 etc.) 
        reject(new Error(this.statusText)); 
       } 
      }; 
      request.onerror = function() { 
       reject(new Error(
        'XMLHttpRequest Error: '+this.statusText)); 
      }; 
      request.open('GET', url); 
      request.send(); 
     }); 
} 

これまで私が行ってきたこと。ここで おかげ

+1

してくださいあなたがこれまでに試したことを示してください。 –

+0

私は新しい約束を作成しましたが、進行中のリクエストを定義する最初の部分に固執しています –

+0

'これまでに試したことを表示してください - 同僚、あなたが同僚の開発者から助けを受けたい場合は、お金。私たちはあなたのためのコードではなく、あなたを助けるためにここにいます。 – ncubica

答えて

3

は約束のコールバックのための一般的なキューです:次に

// Helper to run a callback when a promise either resolves, or rejects. 
function fin(promise, callback){ 
    return promise.then(
    value => (callback(), Promise.resolve(value)), 
    error => (callback(), Promise.reject(error)) 
); 
} 

function makeQueue(maxParallel){ 
    const queue = []; 
    let inProgress = 0; 

    // Run the oldest queued task. 
    function run(){ 
    const {resolve, reject, callback} = queue.shift(); 

    inProgress++; 
    return fin(callback(),() => inProgress--).then(resolve, reject); 
    } 

    // If more tasks can run in parallel, start them 
    function dequeue(){ 
    if (queue.length > 0 && inProgress < maxParallel) run().then(dequeue); 
    } 

    return function(callback){ 
    return new Promise((resolve, reject) => { 
     queue.push({resolve, reject, callback}); 
     dequeue(); 
    }); 
    } 
} 

httpGetをキューにキューを使用します。

const queue = makeQueue(5); 

// Queue up httpGet calls. 
function httpGetWithQueue(url){ 
    return queue(() => httpGet(url)); 
} 

次に再試行ロジックでそれを呼び出す:

// Call httpGet with queued processing, with the request tried 
// up to three times. 
function httpGetWithRetry(url){ 
    let result = Promise.reject(); 

    for (var i = 0; i < 3; i++){ 
    result = result.catch(() => httpGetWithQueue(url)); 
    } 
    return result; 
} 
関連する問題