2016-10-22 3 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; 
} 
관련 문제