为什么setTimeout函数是非阻塞的?

问题描述

如果setTimeout是同步的,为什么它不阻塞?如果不是主线程,它将在哪个线程上执行?

解决方法

为什么setTimeout函数不返回承诺?

主要因为它早已将Promises添加到JS语言中。

setTimeout是同步还是异步?

它同步运行,并在一个函数中排队以运行以后

为什么setTimeout不返回承诺而是返回数字?

它返回一个用于clearTimeout的数字。

我们可以在setTimeout上使用await吗?

您只能有用地await一个诺言。


您可以从传递给resolve的回调函数中wrap a call to setTimeout in a promisesetTimeout

await new Promise( resolve => setTimeout(() => {
    // do whatever you like after 1s
    // then:
    resolve();
},1000);
,

超时功能是异步的,这就是为什么它是非阻塞的。它在主线程上执行。 超时功能执行如下:

JavaScript中的计时器回调(setTimeout,setInterval)为 保留在堆内存中,直到它们过期。如果有的话 堆中的计时器过期,事件循环将执行回调 与它们关联并开始按升序执行它们 直到定时器队列为空之前的延迟时间。

,

setTimeout 本质上是同步的。它的回调在定时器阶段被事件循环注册,它将以异步方式执行。