Pregunta ¿Cómo usar ES8 async / await con streams?


En https://stackoverflow.com/a/18658613/779159 es un ejemplo de cómo calcular el md5 de un archivo utilizando la biblioteca criptográfica incorporada y las transmisiones.

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 a usar ES8 async / await en lugar de usar la devolución de llamada como se ve arriba, pero manteniendo la eficiencia del uso de transmisiones?


21
2017-11-08 22:20


origen


Respuestas:


async/await solo funciona con promesas, no con transmisiones. Hay ideas para crear un tipo de datos similar a un flujo extra que obtenga su propia sintaxis, pero son muy experimentales en todo caso y no entraré en detalles.

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

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

44
2017-11-08 22:30