2017-03-09 6 views
0

다음 코드는 GitHub API을 사용하여 릴리스에 대한 데이터를 검색합니다. 불행히도이 옵션은 30 개 (기본값) 또는 100 개까지만 반환합니다. page 매개 변수를 사용요청 호출을 반복하고 결과를 객체에 저장하는 방법은 무엇입니까?

request(`https://api.github.com/repos/${owner}/${repo}/releases?page=1&per_page=30`, options, function (error, response, body) { 
    if (response.statusCode !== 200) { 
     return console.log(`Error: response code ${response.statusCode}`) 
    } 

    let data = JSON.parse(body); 

    data.forEach(function(element) { 
     // do things with data 
    }); 
}); 

, 페이지 당 최대를 넘어 항목을 검색 할 수 있어야한다. 질문 :이 request 호출을 반복하고 모든 결과를 포함하는 하나의 객체를 반환하려면 어떻게해야합니까?

는 여기에 내가 시도 내용은 다음과 같습니다

여기
function getReleases(callback, page = 1) { 
    request(`https://api.github.com/repos/${program.owner}/${program.repo}/releases?page=${page}&per_page=30`, options, function (error, response, body) { 
     if (response.statusCode !== 200 || error) { 
      console.log(`Error ${response.statusCode}`); 
      callback(null) // not sure about this 
     } 

     let data = JSON.parse(body); 
     callback(data); 
    }); 
} 

function formatReleaseData(data) { 
    // do things with data 
} 

formatReleaseData(show_page_count); 
+0

내가 볼 수있는 콜백 예가 있습니까? – Raymond

+0

@Raymond 제 편집을 좀 보시기 바랍니다. – idleberg

답변

1

당신이 동기 요청을 시뮬레이션하고 더 나은 흐름을 제어 ES6 생성기를 사용하여 할 수있는 방법이다. 자세한 내용은 article을 참조하십시오.

난 발전기를 약속하고 관리하기 위해 bluebird을 사용하고 있습니다.

아래 코드를 확인하십시오.

const request = require('request'); 
const Promise = require('bluebird'); 


function promisifyRequest(currentPage) { 
    const url = `https://api.github.com/repos/${owner}/${repo}/releases?page=${currentPage}&per_page=30`; 

    return new Promise((resolve, reject) => { 
    request(url, options, (err, res, content) => { 
     if (res.statusCode !== 200) { 
     return reject(res.statusCode); 
     } 
     resolve(JSON.parse(content)); 
    }); 
    }); 
} 

function * doRequest() { 
    const result = []; 
    let currentPage = 1; 
    //Might run until gets a empty array. 
    while (true) { 
    let data = yield promisifyRequest(currentPage); 
    if (!data.length) break; 
    //Appends the results of the current page to the total result. 
    result.splice(result.length, 0, ...data); 
    currentPage = currentPage + 1; 
    } 

    return result; 
} 


Promise.coroutine(doRequest)() 
    .then(result => { 
    //Do something with the result 
    }) 
    .catch(errCode => console.log(`Error: response code ${errCode}`));