2016-10-22 203 views
0

我還是ES6的初學者。 我試圖創建一個函數,它發送一個http(s)請求與一個邏輯,當你發送一個http請求。如果有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; 
}