Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jquery/86.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何同时处理多个事件?_Javascript_Jquery - Fatal编程技术网

Javascript 如何同时处理多个事件?

Javascript 如何同时处理多个事件?,javascript,jquery,Javascript,Jquery,我正在用JS创建一个小游戏,其中有很多事件发生,并且经常同时发生(比如修改html元素或全局JS变量…) 为了处理这个问题,我每1ms使用一个“setInterval”wich循环来查找表中是否有事情要做(“请求”) 每次我需要更改页面上的某些内容时,我都会填充表格,但有时我需要同时更改几个不同的内容 问题是它不会同时更新,当同时有2、3个或更多请求时,它会延迟。我希望这是即时的,如果在同一时间有2个或更多的请求要做,它应该在同一时间做,而不是延迟每个请求(请求的示例:更新jquery中div的

我正在用JS创建一个小游戏,其中有很多事件发生,并且经常同时发生(比如修改html元素或全局JS变量…)

为了处理这个问题,我每1ms使用一个“setInterval”wich循环来查找表中是否有事情要做(“请求”)

每次我需要更改页面上的某些内容时,我都会填充表格,但有时我需要同时更改几个不同的内容

问题是它不会同时更新,当同时有2、3个或更多请求时,它会延迟。我希望这是即时的,如果在同一时间有2个或更多的请求要做,它应该在同一时间做,而不是延迟每个请求(请求的示例:更新jquery中div的宽度)

谢谢你的帮助

var queue = {};

var fixedUpdate = setInterval(function() { //do all the requests in queue 

    $.each(queue, function(key, val) { //for each request present in the queue

        //do something (requests are about updating display or some global variables)

        /*...*/

        //after completing the request we delete it from the queue
        delete queue[key];
    });

}, 1);

轮询队列不是编写Javascript的合适方式。由于浏览器中Javascript的单线程特性,如果您在短时间内连续轮询队列,您的应用程序几乎都不会获得良好的响应

Javascript从一开始就是一种事件驱动语言,当它以事件驱动的方式使用时,它可以有效地工作

您必须有正在将内容放入队列的事件。您应该在队列中添加内容时触发队列处理,而不是使用单独的计时器轮询队列。当向队列中添加内容时,触发队列处理也会给您即时响应,而不是计时器延迟

而且,无论何时处理完队列中的事件,您的代码都应该检查队列中是否还有其他内容,并对其进行处理。通过这种方式,您可以在单线程环境中尽可能接近将所有排队项目添加到队列中时对其进行处理

此外,主浏览器Javascript是单线程的,因此一次只能处理一个排队项目。您不能同时处理多个请求。浏览器确实有webWorkers的真实线程,但这些线程无法访问DOM,因此可能与此无关


此外,根据HTML5规范,
setInterval()
的最短时间是5ms,只有在当时没有其他代码运行的情况下才会如此。

刚刚找到导致延迟的原因。。。。我有一个函数,它在两个值之间创建了一个随机重复时间(最小-最大值),但是我的数学计算失败了,并且该函数返回了一个随机值,即使你给它两个相同的最小值和最大值。

你不能期望
setInterval
给你一个固定的间隔-它可以变化很大,1毫秒的分辨率通常太高。这是个坏消息:(有其他选择吗?你完全错了-JS不是一个实时环境,它是一个异步环境。如果不知道你在做什么,就很难给你指针,但是要更新屏幕上的任何内容,你应该链接到
requestAnimationFrame
。基本上我正在创建一个游戏中,你可以看到健康栏上下移动(比如如果你受到伤害或治疗),所以我需要在很短的时间内进行大量更新“同时”不会发生任何事情在JS中。感谢您的澄清,但我担心,这与我想要做的不兼容。我正在寻找一种替代方法,我可以使用Unity,但JS对我来说更容易:/@user4792376-我认为真正发生的是,您当前对应用程序设计的想法与Javascript的工作方式不兼容。我很确定你的游戏有一个与Javascript工作方式兼容的设计,但它需要一些新的设计思想。