Узел JS: Как создать неблокирующий цикл? - PullRequest
0 голосов
/ 28 мая 2019

Я читал об асинхронном и неблокирующем вводе-выводе в 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();
...