J'ai un tableau de promesses en boucle, j'ai donc utilisé Promise.all pour les parcourir et les appeler ensuite.
let promises = [];
promises.Push(promise1);
promises.Push(promise2);
promises.Push(promise3);
Promise.all(promises).then((responses) => {
for (let i = 0; i < promises.length; i++) {
if (promise.property === something) {
//do something
} else {
let file = fs.createWriteStream('./hello.pdf');
let stream = responses[i].pipe(file);
/*
I WANT THE PIPING AND THE FOLLOWING CODE
TO RUN BEFORE NEXT ITERATION OF FOR LOOP
*/
stream.on('finish', () => {
//extract the text out of the pdf
extract(filePath, {splitPages: false}, (err, text) => {
if (err) {
console.log(err);
} else {
arrayOfDocuments[i].text_contents = text;
}
});
});
}
}
promise1, promise2 et promise3 sont quelques requêtes http, et si l'une d'entre elles est une application/pdf, alors je l'écris dans un flux et j'analyse le texte. Mais ce code exécute l'itération suivante avant d'analyser le test en dehors du pdf. Existe-t-il un moyen de faire attendre le code jusqu'à ce que la tuyauterie vers le flux et l'extraction soit terminée avant de passer à la prochaine itération?
Quelque chose comme ce qui suit pourrait aussi marcher. J'utilise ce motif assez souvent:
let promises = [];
promises.Push(promise1);
promises.Push(promise2);
promises.Push(promise3);
function doNext(){
if(!promises.length) return;
promises.shift().then((resolved) =>{
if(resolved.property === something){
...
doNext();
}else{
let file = fs.createWriteStream('./hello.pdf');
let stream = resolved.pipe(file);
stream.on('finish', () =>{
...
doNext();
});
}
})
}
doNext();
ou divisez le gestionnaire en un contrôleur et en un gestionnaire Promisified:
function streamOrNot(obj){
return new Promise(resolve, reject){
if(obj.property === something){
resolve();
return;
}
let file = fs.createWriteStream...;
stream.on('finish', () =>{
...
resolve();
});
}
}
function doNext(){
if(!promises.length) return;
return promises.shift().then(streamOrNot).then(doNext);
}
doNext()
Sans async/wait, c'est assez méchant. Avec async/wait, faites ceci:
Promise.all(promises).then(async (responses) => {
for (...) {
await new Promise(fulfill => stream.on("finish", fulfill));
//extract the text out of the PDF
}
})
Vous pouvez écrire la partie else dans une fonction auto-invoquée. Pour que le traitement du flux se passe en parallèle
(function(i) {
let file = fs.createWriteStream('./hello.pdf');
let stream = responses[i].pipe(file);
/*
I WANT THE PIPING AND THE FOLLOWING CODE
TO RUN BEFORE NEXT ITERATION OF FOR LOOP
*/
stream.on('finish', () => {
//extract the text out of the pdf
extract(filePath, {splitPages: false}, (err, text) => {
if (err) {
console.log(err);
}
else {
arrayOfDocuments[i].text_contents = text;
}
});
});
})(i)
Sinon, vous pouvez gérer la partie en streaming dans le cadre de la promesse originale/individuelle elle-même.
A partir de maintenant, vous créez la promesse et l'ajoutez à un tableau. Au lieu de cela, vous ajoutez promise.then au tableau (qui est également une promesse). Et à l'intérieur du gestionnaire, vous effectuez ensuite vos tâches de diffusion en continu.