2016-09-21 3 views
0

Après beaucoup de bricolage et de recherche, je suis en mesure d'obtenir ce code tonwork. Cependant, il se sent sale et j'ai dû faire face à de nombreux problèmes car le nœud n'aime pas transmettre les données aux variables globales, y a-t-il une meilleure façon d'écrire cela? Je suis très novice en ce qui concerne les nœuds, alors j'ai l'impression de manquer des pièces qui auraient rendu ma vie beaucoup plus facile. Conformément à la suggestion @JordanHendrix, je vais passer aux littéraux de gabarit.Ma solution semble "laide"

var wikipedia = require("node-wikipedia"); 
var infobox = require('wiki-infobox'); 
var Promise = require('es6-promise').Promise; 

var fs = require('fs'); 

String.prototype.format = function() 
{ 
    var content = this; 
    for (var i=0; i < arguments.length; i++) 
    { 
     var replacement = '{' + i + '}'; 
     content = content.replace(replacement, arguments[i]); 
    } 
    return content; 
}; 


function getLinks() { 
    return new Promise(function(resolve, reject) { 
    wikipedia.page.data("List_of_hip_hop_musicians", { content: true }, function(response) { 
     fs.writeFile("response.json", JSON.stringify(response, null, 2), function(err) { 
     if(err) { 
      return console.log(err); 
     } 
     }); 
     resolve(response.links); 
    }); 
    }); 
} 


function getInfo(links){ 
    return new Promise(function(resolve, reject) { 
    fs.appendFile("info.csv", "name, background, birth_name, birth_date, birth_place, origin, genre, occupation, instrument, years_active, label, website\n", function(err) { 
     if(err) { 
     return console.log(err); 
     } 
    }); 
    for (i=0; i<10; i++) { 
     var link = links[i]['*']; 
     resolveInfo(link).then(function(newText){ 
     fs.appendFile("info.csv", newText, function(err) { 
      if(err) { 
      return console.log(err); 
      } 
     }); 
     }); 
    } 
    resolve(text) 
    }); 
} 


function resolveInfo(link) { 
    return new Promise(function(resolve, reject) { 
    infobox(link, 'en', function(err, data){ 
     if (err) { 
     return console.log(err); 
     } 
     try { 
     var text = '{0}, {1}, {3}, {4}, {5}, {6}, {7}, {8}, {9}, {10}, {11}\n'.format(data.name.value, data.background.value, data.birth_name.value, data.birth_date.value, JSON.stringify(data.birth_place), data.origin.value, data.genre.text, JSON.stringify(data.occupation), data.instrument.text, data.years_active.value, data.label.value, data.website.value); 
     } catch(err){ 
     var text = ""; 
     } 
     resolve(text); 
    }); 
    }); 
} 


getLinks().then(function(links) { 
    getInfo(links).then(function(text){ 
    }); 
}); 
+0

pourquoi ne pas simplement utiliser ici littérales modèle, si vous ne savez pas ce qu'ils sont – JordanHendrix

+0

@JordanHendrix probs 'littérales modèle de ES6 de Google parce que je Je n'ai jamais entendu parler du terme aujourd'hui. J'ai littéralement commencé à taper il y a quelques heures. Je viens d'un lourd fond Python et Go. Bien que je l'ai juste googlé et bien que cela semble être un bon remplacement pour le prototype de chaîne, cela n'aide pas avec le problème réel, où sur la ligne 66 console.log (texte) je ne vois pas les données que je m'attends. – reticentroot

+1

ok cool, oui je pensais que vous pourriez ne pas savoir, jette un coup d'oeil, il va faire sens! https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Template_literals – JordanHendrix

Répondre

1

Je considérerais quelques choses. Premièrement: utilisez les fonctions de flèche autant que possible, cela vous donne un code beaucoup plus propre.

new Promise((resolve, reject) => { 
    //... 
}); 

Vous voudrez peut-être jeter un oeil dans promisification de continuer le nettoyage. Vous auriez besoin d'utiliser la bibliothèque de promesses de bluebirds (que je recommanderais quand même).

var fs = require("fs"); 
Promise.promisifyAll(fs); 
fs.readFileAsync("file.js", "utf8").then(...) 

Last but not least, la chaîne vos promesses correctement:

getLinks() 
    .then(getInfo) 
    .then(text => console.log(text)); 
+0

Génial, laissez-moi travailler sur ces suggestions, merci. – reticentroot