J'utilise Rx.js pour traiter le contenu d'un fichier, faire une requête http pour chaque ligne, puis agréger les résultats. Cependant, le fichier source contient des milliers de lignes et je surcharge l'API http distante à laquelle j'effectue la requête http. Je dois m'assurer que j'attends la requête http existante pour rappeler avant de commencer une autre. Je serais ouvert à la mise en lots et à l'exécution des requêtes n
à la fois, mais pour ce script, l'exécution des requêtes en série est suffisante.Rx.js attendre la fin du rappel
Je donne les résultats suivants:
const fs = require('fs');
const rx = require('rx');
const rxNode = require('rx-node');
const doHttpRequest = rx.Observable.fromCallback((params, callback) => {
process.nextTick(() => {
callback('http response');
});
});
rxNode.fromReadableStream(fs.createReadStream('./source-file.txt'))
.flatMap(t => t.toString().split('\r\n'))
.take(5)
.concatMap(t => {
console.log('Submitting request');
return doHttpRequest(t);
})
.subscribe(results => {
console.log(results);
}, err => {
console.error('Error', err);
},() => {
console.log('Completed');
});
Cependant, cela ne fonctionne pas les requêtes http en série. Il produit:
Submitting request Submitting request Submitting request Submitting request Submitting request http response http response http response http response http response Completed
Si je supprime l'appel à concatAll()
alors les demandes sont en série, mais ma fonction s'abonner est de voir les avant que les demandes observables http sont revenus.
Comment puis-je effectuer les demandes HTTP en série afin que la sortie soit comme ci-dessous?
Submitting request http response Submitting request http response Submitting request http response Submitting request http response Submitting request http response Completed
En note, vous pouvez réduire la complexité en fusionnant les opérateurs. 'map' +' flatMap' => 'flatMap',' map' + 'concatAll' =>' concatMap'. – paulpdaniels
Merci, j'ai mis à jour l'exemple pour refléter cette – toby