在https://stackoverflow.com/a/18658613/779159中是一个如何使用内置加密库和流计算文件的md5的示例。
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);
但是,有没有可能将其转换为使用ES 8 async/await,而不是使用上面看到的回调,同时仍然保持使用流的效率?
7条答案
按热度按时间disbfnqx1#
async
/await
只适用于promise,不适用于streams。有一些想法可以创建一个额外的类似stream-like的数据类型,它将拥有自己的语法,但这些都是高度实验性的,我不会详细介绍。无论如何,回调只是等待流的结束,这非常适合于承诺。您只需要 Package 流:
现在你可以等待承诺了
ckocjqey2#
如果您使用的节点版本〉= v10.0.0,那么您可以使用stream.pipeline和util.promisify。
5f0d552i3#
节点V15现在在stream/promises中有promisfiy管道,这是最干净最正式的方式。
我们都应该感谢它在这里做了多少工作:
这个管道是Node.JS最强大的特性之一。让它完全异步并不容易。现在我们有了它。
rur96b6h4#
类似这样的方法是可行的:
zzoitvuj5#
2021年更新:
节点文档中的新示例:
see https://nodejs.org/api/stream.html#stream_readable_symbol_asynciterator
fwzugrvs6#
我想评论一下,但是我没有足够的声誉。
提醒一句:如果你有一个应用程序正在传递流并且执行async/await,在你等待之前要非常小心地连接所有的管道。你可能最终得到的流并不包含你认为它们所做的事情。
bakd9h0s7#
我相信它会对某人有所帮助: