setTimeout() 和 setInterval() 函数是异步的吗?

问题描述 投票:0回答:3

我读到

setTimeout()
setInterval()
用于模仿异步行为。但我不知道他们是不是真的。

javascript asynchronous settimeout setinterval
3个回答
2
投票

它们是异步的,并在 JavaScript 事件循环中运行。然而它们不是

async
,这是围绕与 Promises 一起使用的函数的语法糖。

我们可以提供一个具体的例子来说明如何使用

setTimeout
来轻松利用
async
await
。单击 run snippet 在您自己的浏览器中验证结果 -

const sleep = ms =>
  new Promise(r => setTimeout(r, ms))  // <- Promise around setTimeout
  
async function main()
{ console.log("powering on. please wait ...")
  await sleep(1000)
  console.log("initializing system resources...")
  await sleep(1500)
  console.log("133 MHZ CPU deteced")
  await sleep(1200)
  console.log("64 KB RAM available")
  await sleep(2000)
  console.log("120 MB hard drive deteced")
  await sleep(500)
  console.log("registering PCI devices...")
  await sleep(1000)
  console.log("starting MS-DOS...")
  return "ready"
}

main().then(console.log, console.error)

powering on. please wait ...
initializing system resources...
133 MHZ CPU deteced
64 KB RAM available
120 MB hard drive deteced
registering PCI devices...
starting MS-DOS...
ready

1
投票

两者都将函数作为参数并安排该函数稍后执行。因此,人们可以说它们在某种意义上是“异步”的。然而,在 JavaScript 中,“异步”一词具有非常具体的含义,因为

async
是用于声明函数的关键字,从这个意义上说,它们不是异步的,因为它们不返回 Promise。


-1
投票

快速回答 javascript 是同步的,但某些回调是异步的。

setTimeout() 函数将在堆栈中被触发,然后继续执行后面的操作,即使它尚未完成其计时器。

Javascript 自然是同步的,但有些回调是异步的,例如 setTimeout 和 setInterval,现在如果你想等待某些事情,请考虑使用 Promise 来代替

new Promise(() => console.log()
。 - 我提供了错误的信息,现在修复它

如果您像这样编写一个简单的代码块,您会注意到

non timeout
将先打印
interval
然后
timeout
,即使它是以相反的顺序放置的。

setTimeout(() => console.log('timeout'), 3000)
setInterval(() => console.log('interval'), 2000)
console.log('non timeout')
© www.soinside.com 2019 - 2024. All rights reserved.