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

Javascript 如何使用while循环在控制台记录一个项目和另一个项目之间生成延迟?,javascript,html,Javascript,Html,我有以下代码,但它似乎不工作。我想登录到控制台“深绿色”,让它等待几毫秒,然后记录“浅绿色”,所有这些都不使用setInterval或setTimeout。这在javascript中是可能的吗 function logGreen() { console.log("dark-green"); wait(200); console.log("light-green"); } function wait(ms) { var time = new Date(); var millisec

我有以下代码,但它似乎不工作。我想登录到控制台“深绿色”,让它等待几毫秒,然后记录“浅绿色”,所有这些都不使用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;
 }
}
函数logGreen(){
控制台日志(“深绿色”);
等待(200);
控制台日志(“浅绿色”);
}
函数等待(毫秒){
变量时间=新日期();
var millides=time.getmillides();
var startTime=毫秒;
var currentTime=毫秒;
同时(当前时间-开始时间<毫秒){
currentTime=毫秒;
}
}

我遇到的问题是,循环中断了浏览器,可以说,我不知道如何解决这个问题。对于for循环,有什么方法可以做到这一点吗?

代码的问题是,在
循环时,currentTime的值没有在
中正确更新

while
循环中的代码将无限期执行(无限循环),导致堆栈溢出-我假设这就是您所说的“中断浏览器”的意思。这是因为您的条件始终为真:
startTime
currentTime
是相同的值(
currentTime-startTime<200

请尝试以下方法:

 while(currentTime - startTime < ms) {
   time = new Date();
   currentTime = time.getTime();
 }
while(当前时间-开始时间

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

您可以将生成器作为延迟生成器。请看下面的例子。运行无限循环setInterval。您可以根据自己的用途修改代码

这在支持es6的浏览器和节点8.9.1LTS或更高版本上受支持


setInterval
?否
setTimeout
?允许您使用吗?您所说的“中断浏览器”是什么意思?
window.setInterval
是一种更好的方法。我认为您正确地诊断了问题,但没有:调用
getmillizes()
不返回最新时间。@Bergi已更正。OP也不能使用
GetMillimes
,而应使用
getTime
,否则,如果等待时间跨越第二个边界,这将失败。@Bergi我在这里学到的和OP一样多。是,使用
getTime
,因为
getmillizes
只返回0到999之间的数字。在这里。非常感谢,这很有效。我遇到了一个新问题,我想应用相同的逻辑,但是我不想在控制台上记录“深绿色”和“浅绿色”,而是想更改div的背景颜色。我在这里重新提出了这个问题:我想知道是否有人对我如何实现这一点有一些意见。
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
}