【问题标题】:Are setTimeout() and setInterval() functions async?setTimeout() 和 setInterval() 函数是异步的吗?
【发布时间】:2021-06-29 01:03:28
【问题描述】:

我是前端新手。在 Javascript 中,setTimeout() 和 setInterval() 函数是异步的吗?我读了一些教程,使用这两个函数来模拟异步,但我不知道它们是否真的是。

【问题讨论】:

  • 是的,它们是异步的
  • @AlonEitan 只是补充:但他们不返回承诺。

标签: javascript asynchronous settimeout setinterval


【解决方案1】:

两者都将函数作为参数并安排该函数稍后执行。因此,可以说它们在某种意义上是“异步的”。然而,在 JavaScript 中,“async”这个词有一个非常具体的含义,因为async 是一个用于声明函数的关键字,在这个意义上它们不是异步的,因为它们不返回 Promise。

【讨论】:

  • 1. async 是一个非常古老的概念的非常新的语法。在将async 添加到语言中之前,有一些异步操作被简称为“异步”。 2. 既然你想在这里迂腐并声称setTimeout 不是异步的,因为它没有使用async 关键字,我想指出没有async 关键字。如果有this wouldn't be possible
【解决方案2】:

快速回答 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')

【讨论】:

  • await setTimeout() 不会等到完成,因为setTimeout 不会返回承诺。只能等待承诺。
【解决方案3】:

它们是异步的,并在 JavaScript event loop 中运行。但是它们不是async,它是一个围绕与Promises 一起工作的函数的语法糖。

我们可以提供一个具体示例,说明如何使用setTimeout 轻松利用asyncawait。点击run sn-p在你自己的浏览器中验证结果-

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

【讨论】:

    猜你喜欢
    • 2020-06-29
    • 1970-01-01
    • 2013-09-25
    • 2013-11-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-11-22
    相关资源
    最近更新 更多