节点JS:如何创建非阻塞循环?

时间:2019-05-28 10:24:48

标签: node.js asynchronous

我一直在阅读有关Node JS中的异步和非阻塞IO的信息,我认为我会尝试写一些简单的东西。

加密功能仅代表一项非常漫长而艰巨的任务,可能需要花费大量时间。重要的是,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();

0 个答案:

没有答案