NodeJS 此程序可以更改setinterval的定义,也可以不更改

mtb9vblg  于 2022-12-22  发布在  Node.js
关注(0)|答案(2)|浏览(169)

此处为a == 3,条件为真,但当setinterval运行时,a的值将为4,然后,do while将检查条件,结果为假条件,但不会运行。
我看不出有什么错误。
setinterval阻塞了下一个要验证的条件,但它是一个无限循环,不会结束,因此不会检查条件,但do while首先执行,而不检查条件,内部if condition为true将执行setinterval方法,但异步函数定义中产生的混淆是(它将是多线程的,因此两者的执行将同时运行,它将保持执行setinterval并执行即将到来的语句)通过遵循定义,它将首先检查条件,但这将证明do while循环的定义是错误的,因为在do while中,条件是在第二次检查中检查的迭代将执行第一迭代而不检查循环的条件。

var a=3;

function ali() {
  console.log("testing and understanding setInterval method");
  a++;
}

do {
  if (a == 3)
    setInterval(ali,1000);
} while (a == 3);

setInterval应该运行,但由于是异步函数,因此运行时没有输出。运行时,Node.js中显示 * 堆堆栈已满 *。

pgky5nke

pgky5nke1#

JavaScript不是多线程的。您基本上拥有:

condition = true;
do {
  setInterval(some_function_that_changes_condition, 1000)
} while(condition);

你说得对,这是一个无限循环。
这就像说***“我会一直点披萨,直到有一个送到为止”***。所以你开始在电话上点披萨,但是当其中一个披萨真正送到时,你***从来没有应门,因为你忙碌打电话***订购更多的披萨。
setInterval基本上是调度一个函数稍后运行,但是在JavaScript中不会发生任何其他事情,除非您从编写此代码的函数返回,从而放弃对JavaScript上下文的控制。JavaScript无法中断循环的执行以执行回调。也许您认为这可能在setInterval调用期间发生?但它不会。
在Node.js中,计时器可能已经安排好了,想要调用回调函数的线程可能是可运行的,但是JavaScript引擎本身正忙碌运行无限循环,无法被中断。

vawmfj5a

vawmfj5a2#

计时器函数永远不能保证它们会在间隔后精确运行,它字面上说“我会在指定时间后获得呼吸空间后立即执行它”。
什么是呼吸空间?每次函数运行时,JS引擎都会等待函数返回。这就是呼吸空间。在这个时候,JS引擎会检查它的“事件循环”下一个要执行的操作。这是定时器函数唯一可以被安排运行的时间。
在下面的示例中,计时器在长循环结束之前从不运行。

function test()  {

  console.log('Starting')
  
  setTimeout(()=> console.log('timer executed'), 1000)
  
  for (let i=1; i<=9999999999; i++);
  
  console.log('the loop is over');
  

}

test()

相关问题