如何使用while循环在控制台记录一个项目和另一个项目之间产生延迟?

问题描述 投票:0回答:2

我有以下代码,但它似乎不起作用。我想登录控制台“深绿色”,让它等待几毫秒,然后记录“浅绿色”,所有没有使用setInterval或setTimeout。用javascript可以实现吗?

function logGreen() {
 console.log("dark-green");
 wait(200);
 console.log("light-green");
}

function wait(ms) {
  var time = new Date();
  var milliseconds = time.getMilliseconds();
  var startTime = milliseconds;
  var currentTime = milliseconds;
  while(currentTime - startTime < ms) {
 currentTime = milliseconds;
 }
}

我遇到的问题是循环破坏浏览器可以这么说,我不知道如何解决这个问题。有没有办法用for循环执行此操作?

javascript html
2个回答
1
投票

你的代码的问题是你的while循环中没有正确更新currentTime的值。

你的while循环中的代码将无限期地执行(无限循环)导致堆栈溢出 - 我假设你的意思是“打破浏览器”。这是因为你的条件总是正确的:startTimecurrentTime是相同的值(currentTime - startTime < 200

试试这个:

 while(currentTime - startTime < ms) {
   time = new Date();
   currentTime = time.getTime();
 }

创建一个新的Date对象并在循环中调用time.getTime()将返回最新的时间并应该解决您的问题。使用getTime()而不是getMilliseconds(),因为后者只返回0到999之间的数字(即小于一秒)。这个有限的上限范围对您的代码会有问题,因为getMilliseconds()只会返回自上一秒开始经过的毫秒数。


0
投票

你可以将生成器作为懒惰的评估。请看下面的例子。运行无限循环setInterval。您可以根据您的使用情况修改代码。

es6支持的浏览器和节点8.9.1LTS或更高版本支持此功能。

function* asyncRandomNumbers() {
  let tm = new Date().getTime();
  while (true) {
    let updatedTm = new Date().getTime()
    if(updatedTm - tm >= 1000){
      tm = updatedTm;
      yield tm;
    }
  }
}
for (var val of asyncRandomNumbers()) {
  console.log(val) // outputs 0 — 9
}
© www.soinside.com 2019 - 2024. All rights reserved.