【问题标题】:Multiple timeouts or multiple calls in JavascriptJavascript 中的多次超时或多次调用
【发布时间】:2016-09-08 08:48:01
【问题描述】:

上下文: 我正在玩弄一个游戏创意,只是为了好玩,我在 html5 的画布和 javascript 中做这件事,只是因为我想在闲逛的时候练习。

问题: 在我的游戏中,有很多事情会在不同的时间发生,并且不断创造新的事情要做。精度不是必需的,只要在几秒钟内即可。

我的第一个想法是简单地创建一个数组,它是手动排序的,通过根据执行时间插入新任务,然后我会设置一个超时函数,它会抓取新任务,处理它,获取下一个排队询问的时间,并等待超时,当添加新项目时,它会检查它是否是新的第一个排队,并适当地更改超时。

听起来比实际复杂。

但后来我开始怀疑.... 设置多个计时器会有什么陷阱? 起初我认为设置多个计时器是个坏主意,但后来我开始怀疑浏览器是否以我上面所说的相同方式处理时间,或者其他有效的方式。

所以基本上,总结一下我的担忧: 使用多个超时有什么问题,而不是一个接一个地做。 这种方法有什么陷阱吗?或任何“陷阱”

提前致谢!

【问题讨论】:

标签: javascript


【解决方案1】:

设置多个超时不会影响你的表现,所以你应该停止担心。 Node.js 内部 handles timeouts in a similar manner to yours idea。如果你想看一些例子,看下面的sn-p:

let count = 10000;

console.time('Total time')

for (let i = 0; i < count; ++i) {
  setTimeout(() => {
    if (--count === 0) {
      console.timeEnd('Total time')
    }
  }, i / 10); // Set 10 timeouts for each millisecond
}

理想情况下,它的执行时间应该正好是 1000 毫秒,如您所见,实际结果与此相差不远。

【讨论】:

    【解决方案2】:

    在我的脑海中,您应该记住的一件事是,一次超时是您必须分配的一个变量。如果您想在它触发之前取消该超时,您需要使用它的句柄 clearTimeout()。如果你有很多,你的代码可能会变得混乱。

    此外,Javascript 是单线程的,因此不能同时执行任何操作。当然它的速度足以让人感觉瞬间完成,但堆叠顺序也不会有什么不同。

    归根结底,您可以选择最喜欢的方式进行编码,因此您是选择执行一个大型全局处理功能还是多个小型专用处理功能取决于您:)

    【讨论】:

    • 我明白这一切,是的,但超时如何在幕后工作是我的问题,我担心会耗费大量资源或其他东西。感谢您的思路,它帮助我在脑海中描绘了它可能是如何工作的。
    • 据我所知,内部超时是放在浏览器的定时器线程中的,它与js线程是分开的。他们按照自己的意愿倒计时,一旦完成,他们就会将回调放入 js 线程中。 [编辑:因此,如果您担心性能,那么在您拥有数千个之前,这绝对不是问题;)]
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-12-18
    • 2015-01-22
    • 1970-01-01
    • 1970-01-01
    • 2020-03-03
    • 2023-04-10
    • 2021-06-22
    相关资源
    最近更新 更多