【问题标题】:Sleep in javascript, why doesn't it loop?在javascript中睡觉,为什么它不循环?
【发布时间】:2021-05-17 14:43:25
【问题描述】:

我想知道为什么 javascript 的睡眠功能的通用代码不循环

await new Promise(resolve =>{setTimeout(resolve, 5000)});

它为 resolve 分配一个箭头函数,该函数在 5 秒后自行运行 resolve。那么为什么不递归或循环呢?

【问题讨论】:

  • 为什么要递归或循环。什么是resolve函数??
  • 为什么会这样? “睡眠”在这里只发生一次。
  • 不是安排在5秒后调用resolve箭头函数吗?它自己安排它在 5 秒后运行?
  • 不,它会调用一次resolve,仅此而已。如果您希望重复此操作,则需要一个显式循环:for (;;) .. your code ...

标签: javascript recursion promise


【解决方案1】:

resolve是一个函数,由Promise生成。

简单地说,resolve 在内部将Promise 标记为已解决。

但这只会发生一次。 你不能resolvePromise 两次。

一旦Promise 得到解决,它就会“触发”(不知道,如果它是正确的词)给定thencatchfinally 回调。

【讨论】:

  • 不只是resolve 只是我写的一个箭头函数来做一件事吗?设置超时?还是Promise 修改它以添加一些代码来标记Promise 已解决?
  • @Abraham - 不,resolve 是您为箭头函数声明的参数,而不是您创建的函数。请参阅我给您的答复。
  • 没有。您定义的函数是您提供给Promise 构造函数的函数:resolve => {..}。并且该函数接收生成的 resolve 函数作为参数,然后您必须在定义的函数 (resolve => {..; resolve(); ..}) 中调用自己。你甚至会收到第二个参数:reject。这也是一个生成的函数,但不是解析,而是拒绝(因此,触发 .catch 而不是 .then
  • 是的,那是我的大误会,比你!
【解决方案2】:

没有理由这样做。事件系统将在大约五秒后触发对resolve 的调用,无需任何循环,这将履行承诺。

【讨论】:

  • 在事件系统调用resolve时不发出另一个调度?因为resolve是一个箭头函数来设置超时运行resolve它自己?
  • @Abraham - 不。从其他地方的另一条评论中,您似乎认为resolve 是您的代码创建的箭头函数。不是,它是您的代码创建的箭头函数的 参数new Promise 调用一次您的箭头函数。 new Promise 调用您的箭头函数,并为该参数传递一个函数,该函数将解析承诺。然后你将该函数作为回调传递给setTimeout,因此大约五秒钟后,new Promise 给你的函数被调用,其值undefined 实现了承诺。
  • 是的,那是我的大误会,比你!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-09-23
  • 2018-10-11
  • 2017-06-16
  • 2021-07-06
  • 1970-01-01
  • 2019-12-28
相关资源
最近更新 更多