node.js - nodejs - node lts
¿Cómo esperar a que una corriente termine la tubería?(Nodejs) (3)
Algo como lo siguiente también funcionaría. Yo uso este patrón bastante a menudo:
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();
o rompa el controlador en un controlador y un controlador 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()
Tengo una serie de promesas de bucles for, así que utilicé Promise.all para revisarlas y luego las llamé.
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 y promise3 son algunas solicitudes de http, y si una de ellas es una aplicación / pdf, lo escribo en una secuencia y lo analizo. Pero este código ejecuta la siguiente iteración antes de analizar la prueba del pdf. ¿Hay alguna forma de hacer que el código espere hasta que la conexión a la secuencia y la extracción finalicen antes de pasar a la siguiente iteración?
Puede escribir la otra parte dentro de una función autoinvocada. Para que el manejo de stream se realice en paralelo.
(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)
De lo contrario, puede manejar la parte de transmisión como parte de la promesa original / individual.
A partir de ahora, está creando la promesa y agregándola a la matriz, en lugar de eso, agrega la promesa. Luego, a la matriz (que también es una promesa). Y dentro del manejador entonces haces tus cosas.
Sin async / await, es bastante desagradable. Con async / await, simplemente haga esto:
Promise.all(promises).then(async (responses) => {
for (...) {
await new Promise(fulfill => stream.on("finish", fulfill));
//extract the text out of the PDF
}
})