我有以下代码,但它似乎不起作用。我想登录控制台“深绿色”,让它等待几毫秒,然后记录“浅绿色”,所有没有使用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循环执行此操作?
你的代码的问题是你的while
循环中没有正确更新currentTime的值。
你的while
循环中的代码将无限期地执行(无限循环)导致堆栈溢出 - 我假设你的意思是“打破浏览器”。这是因为你的条件总是正确的:startTime
和currentTime
是相同的值(currentTime - startTime < 200
)
试试这个:
while(currentTime - startTime < ms) {
time = new Date();
currentTime = time.getTime();
}
创建一个新的Date对象并在循环中调用time.getTime()
将返回最新的时间并应该解决您的问题。使用getTime()
而不是getMilliseconds()
,因为后者只返回0到999之间的数字(即小于一秒)。这个有限的上限范围对您的代码会有问题,因为getMilliseconds()只会返回自上一秒开始经过的毫秒数。
你可以将生成器作为懒惰的评估。请看下面的例子。运行无限循环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
}