2015-11-08 9 views
11

W przykładzie https://stackoverflow.com/a/18658613/779159 jest przykładem obliczania wartości md5 pliku za pomocą wbudowanej biblioteki kryptograficznej i strumieni.Jak korzystać z asynchronizacji ES8/oczekiwać w strumieniach?

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

Ale czy to możliwe, aby przekształcić to do korzystania ES8 asynchronicznie/czekają zamiast używania wywołania zwrotnego, jak widać powyżej, ale zachowując efektywność wykorzystania strumieni?

+1

'asynchroniczny/await' jest niczym wsparcia składnia szczebla ds obietnic. Jeśli umieścisz ten kod w obietnicy, skończysz. –

Odpowiedz

28

async/await działa tylko z obietnicami, a nie strumieniami. Istnieją pomysły na stworzenie dodatkowego typu strumienia, który miałby własną składnię, ale są one wysoce eksperymentalne, jeśli w ogóle i nie będę wchodził w szczegóły.

W każdym razie Twój callback czeka tylko na koniec strumienia, który idealnie pasuje do obietnicy. że po prostu trzeba zawinąć strumienia:

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

Teraz można oczekiwać obietnicy:

(async function() { 
    let sha1sum = await end; 
    console.log(sha1sum); 
}()); 
Powiązane problemy