Если значение выражения, следующего за оператором ожидания, не является Обещанием, оно преобразуется в разрешенное Обещание.
readStream.on
не возвращает обещание, поэтому ваш кодне будет работать так, как вы ожидаете.
Вместо использования await
оберните readStream.on
внутри Promise
и resolve
, когда он закончится.
function hash_file(key) {
// open file stream
const readStream = fs.createReadStream("./foo.js");
const hash = crypto.createHash("sha512", key);
hash.setEncoding("hex");
// once the stream is done, we read the values
return new Promise((resolve, reject) => {
readStream.on("end", () => {
hash.end();
// print result
resolve(hash.read());
});
readStream.on("error", reject);
// pipe file to hash generator
readStream.pipe(hash);
});
}
Я пытаюсь создать функцию, которая читает файл и возвращает хэш и , которые можно использовать синхронно
Этого не произойдет, никогда.Вы не можете сделать асинхронный код синхронным.Вы можете сделать так, чтобы он выглядел синхронно, используя async/await
, но он всегда будет асинхронным.
(async() => {
const hash = await hash_file('my-key'); // This is async.
console.log(hash);
})();