2017-03-09 1 views
0

Le code suivant extrait des données sur les versions à l'aide de GitHub API. Malheureusement, cela ne renvoie que 30 (par défaut) ou jusqu'à 100 éléments.Comment itérer des appels et stocker des résultats sur un objet?

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 
    }); 
}); 

En utilisant le paramètre page, il devrait être possible de récupérer des éléments au-delà du maximum par page. La question est: Comment puis-je itérer ces appels request et retourner un objet contenant tous les résultats?

Voici ce que j'ai essayé:

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

Existe-t-il un exemple de rappel que je peux regarder? – Raymond

+0

@Raymond S'il vous plaît jeter un oeil à mon édition – idleberg

Répondre

1

Voici comment vous pouvez le faire en utilisant des générateurs ES6 pour simuler les requêtes synchrones et mieux contrôler votre flux. Vous pouvez lire ce article pour des concepts plus profonds. J'utilise bluebird pour promisifier et gérer le générateur.

Vérifiez le code ci-dessous.

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}`));