Ho scritto uno script di nodo che ottiene alcuni dati richiedendo i dati dell'API REST (usando la richiesta di libreria). Si compone di un paio di funzioni in questo modo:come risolvere "questo" problemi con le librerie di nodi come asincrona e richiesta
var data = { /* object to store all data */ },
function getKloutData() {
request(url, function() { /* store data */}
}
// and a function for twitter data
Perché voglio fare alcune cose, dopo il recupero tutto l'ho usato l'asincrona libreria per eseguire tutte le funzioni di recupero in questo modo:
async.parallel([ getTwitterData, getKloutData ], function() {
console.log('done');
});
Questo tutto funziona benissimo, però ho voluto mettere tutto all'interno di un modello di oggetto così ho potuto prendere più account contemporaneamente:
function Fetcher(name) {
this.userID = ''
this.user = { /* data */ }
this.init();
}
Fetcher.prototype.init = function() {
async.parallel([ this.getTwitterData, this.getKloutData ], function() {
console.log('done');
});
}
Fetcher.prototype.getKloutData = function(callback) {
request(url, function() { /* store data */ });
};
questo non funziona perché asincrona e richiesta di modifica del presente contesto. L'unico modo ho potuto ottenere intorno è legando tutto ciò mi passano attraverso richiesta asincrona e:
Fetcher.prototype.init = function() {
async.parallel([ this.getTwitterData.bind(this), this.getKloutData.bind(this) ], function() {
console.log('done');
});
}
Fetcher.prototype.getKloutData = function(callback) {
function saveData() {
/* store data */
}
request(url, saveData.bind(this);
};
sto facendo qualcosa di sbagliato di base o qualcosa del genere? Penso che tornare alla sceneggiatura e lanciarlo a child_processes crei troppo sovraccarico.
La biblioteca Underscore ha una comoda funzione chiamata 'bindAll' che rende questo meno doloroso. E se opti per CoffeeScript, puoi semplicemente definire i metodi con la freccia grossa e non dovrai fare alcun legame esplicito. –