在Node.js中,如何打破一个函数内的无限循环?

我有一个异步函数。stopwatch. 调用后,它开始在每一秒钟打印经过的时间(以秒为单位)。

我怎样才能打破这个无限循环,并返回经过的时间呢?击键?

async function stopwatch() {
  let elapsed = 0;
  while (true) {
    process.stdout.write(`Elapsed: ${elapsed} seconds`);
    await sleep(1000);
    elapsed++;
    process.stdout.write("\u001b[2K\u001b[0E"); // clear current line and print at this line again next time
  }
  // on Keystroke: return time elapsed
}

export async function sleep(ms) {
  return new Promise((resolve) => setTimeout(resolve, ms));
}

解决方案:

在了解了一些关于 EventEmitter 并与 keypress 包裹 建议 @rksh1997,我想出了这个办法。

const EventEmitter = require("events");
let keypress = require("keypress");

function sleep(ms) {
  return new Promise((resolve) => setTimeout(resolve, ms));
}

class StopWatch extends EventEmitter {
  constructor() {
    super();
    this.elapsed = 0;
  }
  print() {
    process.stdout.write("\u001b[2K\u001b[0E");
    process.stdout.write(this.elapsed.toString());
  }
}

async function runStopWatch(stopWatch) {
  for (;;) {
    if (stopWatch.stopped) break;
    stopWatch.emit("tick");
    await sleep(1000);
  }
}

async function main() {
  let stopWatch = new StopWatch(400);
  stopWatch.on("tick", function () {
    this.elapsed++;
    this.print();
  });
  stopWatch.on("stop", function () {
    this.stopped = true;
  });
  runStopWatch(stopWatch);
  keypress(process.stdin);
  process.stdin.on("keypress", function (ch, key) {
    if (key && key.name == "q") { // hit 'q' to exit
      stopWatch.emit("stop");
      console.log("Elapsed:", stopWatch.elapsed);
      process.stdin.pause();
    }
  });
  process.stdin.setRawMode(true);
  process.stdin.resume();
}

main()

如何简化我的答案?是否可以不使用EventEmitter?

给TA打赏
共{{data.count}}人
人已打赏
未分类

JavaFX阶段*有时*在Win10上出现空白。

2022-9-8 23:50:19

未分类

增加容器优化操作系统中docker可以访问的磁盘大小。

2022-9-8 23:50:21

0 条回复 A文章作者 M管理员
    暂无讨论,说说你的看法吧
个人中心
购物车
优惠劵
今日签到
有新私信 私信列表
搜索