2015-11-08 3 views
11

In https://stackoverflow.com/a/18658613/779159 è un esempio di come calcolare l'md5 di un file utilizzando la libreria e gli stream di crittografia incorporati.Come utilizzare ES8 async/await with streams?

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

Ma è possibile convertire questo ad usare ES8 async/attendono invece di utilizzare la richiamata come visto sopra, ma pur mantenendo l'efficienza di utilizzo di flussi?

+1

'asincrona/await' non è altro che il supporto a livello di sintassi per promesse. Se riesci a inserire questo codice in una promessa, allora hai finito. –

risposta

28

async/await funziona solo con promesse, non con flussi. Ci sono idee per creare un tipo di dati extra simile al flusso che ottenga la propria sintassi, ma sono altamente sperimentali e non entrerò nei dettagli.

In ogni caso, la tua richiamata è solo in attesa della fine del flusso, che è perfetto per una promessa. Faresti Basta avvolgere il flusso:

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

Ora si può attendere che la promessa:

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