问题描述
如果setTimeout是同步的,为什么它不阻塞?如果不是主线程,它将在哪个线程上执行?
解决方法
为什么setTimeout函数不返回承诺?
主要因为它早已将Promises添加到JS语言中。
setTimeout是同步还是异步?
它同步运行,并在一个函数中排队以运行以后。
为什么setTimeout不返回承诺而是返回数字?
它返回一个用于clearTimeout
的数字。
我们可以在setTimeout上使用await吗?
您只能有用地await
一个诺言。
您可以从传递给resolve
的回调函数中wrap a call to setTimeout
in a promise和setTimeout
。
await new Promise( resolve => setTimeout(() => {
// do whatever you like after 1s
// then:
resolve();
},1000);
,
超时功能是异步的,这就是为什么它是非阻塞的。它在主线程上执行。
超时功能执行如下:
,JavaScript中的计时器回调(setTimeout,setInterval)为 保留在堆内存中,直到它们过期。如果有的话 堆中的计时器过期,事件循环将执行回调 与它们关联并开始按升序执行它们 直到定时器队列为空之前的延迟时间。
setTimeout 本质上是同步的。它的回调在定时器阶段被事件循环注册,它将以异步方式执行。