funciona example es9 es8 como await async javascript node.js async-await ecmascript-2017

example - es8 javascript



¿Cómo usar ES8 async/await con streams? (3)

Algo como esto funciona:

for (var res of fetchResponses){ //node-fetch package responses const dest = fs.createWriteStream(filePath,{flags:''a''}); totalBytes += Number(res.headers.get(''content-length'')); await new Promise((resolve, reject) => { res.body.pipe(dest); res.body.on("error", (err) => { reject(err); }); dest.on("finish", function() { resolve(); }); }); }

En https://stackoverflow.com/a/18658613/779159 hay un ejemplo de cómo calcular el md5 de un archivo utilizando la biblioteca y las secuencias de cifrado incorporadas.

var fs = require(''fs''); var crypto = require(''crypto''); // the file you want to get the hash var fd = fs.createReadStream(''/some/file/name.txt''); var hash = crypto.createHash(''sha1''); hash.setEncoding(''hex''); fd.on(''end'', function() { hash.end(); console.log(hash.read()); // the desired sha1sum }); // read all file and pipe it (write it) to the hash object fd.pipe(hash);

Pero, ¿es posible convertir esto al uso de ES8 async / await en lugar de usar la devolución de llamada como se vio anteriormente, pero manteniendo la eficiencia del uso de flujos?


Si está utilizando la versión de nodo> = v10.0.0, puede usar stream.pipeline y util.promisify .

const fs = require(''fs''); const crypto = require(''crypto''); const util = require(''util''); const stream = require(''stream''); const pipeline = util.promisify(stream.pipeline); const hash = crypto.createHash(''sha1''); hash.setEncoding(''hex''); async function run() { await pipeline( fs.createReadStream(''/some/file/name.txt''), hash ); console.log(''Pipeline succeeded''); } run().catch(console.error);


async / await solo trabaja con promesas, no con streams. Hay ideas para crear un tipo de datos similar a un flujo adicional que obtendría su propia sintaxis, pero son altamente experimentales y no entraré en detalles.

De todos modos, su devolución de llamada solo está esperando el final de la transmisión, que es un ajuste perfecto para una promesa. Solo tendrías que envolver la secuencia:

var fd = fs.createReadStream(''/some/file/name.txt''); var hash = crypto.createHash(''sha1''); hash.setEncoding(''hex''); fd.on(''end'', function() { hash.end(); }); // read all file and pipe it (write it) to the hash object fd.pipe(hash); var end = new Promise(function(resolve, reject) { fd.on(''end'', ()=>resolve(hash.read())); fd.on(''error'', reject); // or something like that });

Ahora puedes esperar esa promesa:

(async function() { let sha1sum = await end; console.log(sha1sum); }());