JavaScript如何最好地实现一个休眠函数?

3
我知道setIntervalsetTimeout函数,但它们都不适合我的情况,因为我需要在每7秒钟的间隔内创建一个img DOM 元素。

  • 图片数量是不预先定义的(每天变化)。

当我使用setInterval时,我不能在一定限制(每天计数)后完全停止它。[clearInterval仅清除迭代]

当我在循环(每天计数)中使用setTimeout时,它从来没有延迟。所以唯一的可能性就是一个睡眠功能。有人能为这种情况提供帮助吗?

  • 在 JavaScript 中实现睡眠函数的最佳方法是什么?

1
如果你的 setTimeout 从未延迟,那么你做错了。请发布一些代码。 - lincolnk
3个回答

4
如何在JavaScript中实现延时函数?
JavaScript代码必须是非阻塞的,因为任何阻塞代码(例如等待某些事情发生的循环)都会使整个浏览器无响应。Web浏览器中的JavaScript不仅运行在单个线程中,而且实际上与页面渲染和UI共享同一个线程。
解决方案是使用定时器:setTimeout()setInterval()。这些函数是非阻塞的;它们立即返回。它们将回调函数附加到将来某个时间触发的超时事件上。在调用setTimeout()函数后不久,JavaScript代码终止执行,因此用户仍然可以使用浏览器。然后,当触发超时时,之前定义的回调被调用,并解释您的代码。这是处理JavaScript中的“延迟”的唯一实用方式。
此外,以下是一篇有趣的文章,介绍了JavaScript计时器的工作原理:
现在,您已经知道为什么阻塞式的sleep函数不起作用,请查看@Tomalak的链接,了解使用setTimeout()setInterval()的一些解决方案。

我同意,但你有关于我的问题的建议吗? - ArK
@Paniyar:让我添加一些进一步的信息…(更新我的答案) - Daniel Vassallo
2
在 JavaScript 中,不能将异步代码(比如超时)同步运行。没有什么例外。sleep 函数是不存在的。 - bobince

2

1
你抱怨setTimeout和setInterval,但是接着又描述了你如何不正确地使用它们。要么在不要循环中使用setTimeout,并在还有更多任务要做时调用另一个setTimeout,要么使用setInterval并在达到维护的计数后调用clearInterval。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接