Я читал об асинхронном и неблокирующем вводе-выводе в Node JS и думал, что попробую написать что-то простое.
Функция шифрования представляет собой очень долгую и сложную задачу, которая может занять любое количество времени. Важно, чтобы цикл for оставался неизменным, поскольку update()
может возвращать что-то для обработки.
Теперь проблема, с которой я столкнулся, заключается в том, что обновление прогресса срабатывает только один раз в начале, а затем один раз в конце после выполнения задачи:
Boop
Progress: 0
Progress: 99.99999000000001
Я полагаю, что я просто блокирую все с помощью длинной задачи, так как я могу убедиться, что другие задачи могут выполняться во время обработки большой задачи?
const crypto = require("crypto");
var randomString = () => {
return crypto.randomBytes(100).toString('hex');
};
var progress = 0;
var going = true;
async function cb() {
const is = 1e7;
const hash = crypto.createHash('sha256');
const update = () => hash.update(randomString());
for (let i = 0; i < is; i++) {
await update();
progress = i / is * 100;
}
going = false;
return hash.digest('hex') + '\n';
};
setTimeout(cb, 0);
console.log("Boop");
function progUpdate() {
console.log("Progress: " + progress);
if (going) {
setTimeout(progUpdate, 100);
}
}
progUpdate();