为什么这个javascript睡眠功能会立即跳过?

时间:2020-07-24 09:02:42

标签: javascript node.js

在isPaused变为true的地方,睡眠函数应该进入无限循环了吗???但是由于某种原因,它不会,而是在之后立即打印“ here2”?我正在将其与异步函数一起使用,当异步函数完成时,布尔isPaused再次变为false。

var isPaused = false;

function sleep() {
    if (isPaused == true) {
        setTimeout(function(){sleep()},1000);
    }
};

console.log("here");

isPaused = true;

sleep();

console.log("here 2");

我该如何解决它,以便它等待而不是继续。

4 个答案:

答案 0 :(得分:2)

如果要等待计时器,则需要将var socket = io().connect('http://127.0.0.1:5000'); socket.emit('test_timer') socket.on('test_timer_reply', function(receiving_data) { console.log(receiving_data); }); Promiseasync一起使用:

await

这里是JSFiddle

答案 1 :(得分:1)

您的代码将运行睡眠功能,然后在1000毫秒后再次运行。

您的代码做什么:

  1. 将isPaused设置为false
  2. 定义睡眠功能(不执行)
  3. 在“此处”登录
  4. 将isPaused设置为true
  5. 执行sleep函数,它将在1000ms后再次被调用,但是程序没有等待它,因此它已经执行了下一行。
  6. 在“这里2”登录

答案 2 :(得分:0)

由于睡眠功能已完成设置超时的操作,因此代码可以继续其余操作。

然后,在连续运行1秒(1000毫秒)后,它将执行另一次睡眠,然后可以自由运行任何其他可能的剩余操作。

因此确实发生了无限循环,但这并不禁止其他代码运行。 尝试将console.log('test')放在睡眠功能的第一行。

function sleep() {
    console.log("test")
    if (isPaused == true) {
        setTimeout(function(){
            sleep()
        },1000);
    }
};

进入这里有点太多,其他人可以比我解释得更多,但是看看JS Event Loop,应该可以澄清一些事情!

答案 3 :(得分:0)

那已经是一个无限循环。只需尝试在setTimeout函数内添加一个“ console.log('loop')”,您将看到每秒如何调用它。

另外,请记住javascript不是同步的,因此它将在睡眠前2列在此处打印(请记住,它需要1秒钟),但它会一直处于无限循环中