tutorial nodejs node home framework ejemplos certificacion node.js asynchronous promise pipe pdftotext

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 } })