Javascript或jQuery中的线程安全队列

Javascript或jQuery中的线程安全队列,javascript,ajax,javascript-events,jquery,Javascript,Ajax,Javascript Events,Jquery,我有许多异步AJAX调用,其结果将得到处理。处理的顺序并不重要,但结果需要一次处理一个。所以我想简单地进行AJAX调用,它们都将结果放在一个队列中。然后,该队列应该在单个线程上得到处理。这样一来,结果会尽快一次处理一个 最好的方法是什么?我正在使用jQuery,非常乐意利用它为此提供的任何功能。如果您只关心浏览器(因为您提到了jQuery,我想这是真的),那么您应该知道。最简单的方法是为回调实现您自己的队列系统(使用push/pop模拟堆栈) 当每个异步请求返回时,将数据添加到数组的末尾,并发出

我有许多异步AJAX调用,其结果将得到处理。处理的顺序并不重要,但结果需要一次处理一个。所以我想简单地进行AJAX调用,它们都将结果放在一个队列中。然后,该队列应该在单个线程上得到处理。这样一来,结果会尽快一次处理一个


最好的方法是什么?我正在使用jQuery,非常乐意利用它为此提供的任何功能。

如果您只关心浏览器(因为您提到了jQuery,我想这是真的),那么您应该知道。

最简单的方法是为回调实现您自己的队列系统(使用push/pop模拟堆栈)

当每个异步请求返回时,将数据添加到数组的末尾,并发出某种
queue.process()
命令,该命令将处理数组中的第一个元素

最后,在该函数的顶部添加类似于
if(alreadyRunning){return;}
的内容,以阻止它同时执行多个任务,这样就得到了单线程队列


编辑:删除了代码,有些人被挂断了,而不是原来的问题

异步并不意味着“多线程”。在处理第一个单击处理程序之前,考虑一行中触发的许多单击事件。一次只能处理一个操作,其他操作将等待执行

事件驱动语言(如Javascript)基于队列进行操作。背景中的Javascript实际上有一个巨大的队列,事件和异步响应被推送到其中。一旦某个特定的处理完成,队列中的下一个项目将被处理

这些队列有时称为“运行循环”。Javascript将在一个无休止的循环中旋转,从队列中检索事件,处理它,然后返回队列进行另一项工作

多线程可以通过使用在(较新)版本的Javascript中实现,但这些都是显式的opt-in。如果你感兴趣的话,可以查一下


要回答您的问题,只需将回调附加到异步请求,即使在中途返回另一个响应,它也将完成处理。另一个响应将“等待”当前事件得到处理。

您可能需要查看

我使用了一个类似于博客文章的实现,并使用了一个名为jQuery的jQuery插件

一旦AJAX请求的任何回调被调用,它就会更新HTML表。回调是异步的


AJAX的本质意味着异步。因此,在AJAX请求的成功回调中处理您的队列,我相信这将实现您的期望。

哇,我没有意识到这一点,看起来很奇怪。。。因此,我可以发出100个AJAX请求,这些请求似乎是异步的,在不同的线程上,回调函数将一次调用一个?@dorktitude-事实上,JavaScript现在是多线程的,多亏了WebWorkers:@jmort253现在在某些浏览器中可以有意地执行多线程操作是正确的,但据我所知,jQuery中的异步查询并不是偶然发生的(即,在OP的问题中,不需要采取特殊的预防措施来保证队列线程的安全),这意味着您的代码在调用查询后不会暂停,但XmlHttpRequest会一个接一个地处理每个请求,检查人们试图在哪里实施真正的并行化,这意味着默认情况下查询是排队的(但如果您担心jQuery.queue不会总是这样,您可以尝试使用jQuery.queue)。应该注意的是,即使使用web workers,也不需要担心代码并行运行,因为web workers不能与主线程或彼此共享变量。每个web worker本质上是一个单线程事件循环,您可以通过类似于ajax调用的方式与它们通信。把它们想象成在浏览器上运行的服务器。它们不是传统的线程。只有当
this.handler(item)
将另一个工作项推到堆栈上时,队列中才会有多个项目。这是绝对没有必要的,因为大多数异步调用在完成时都能够接受回调。我认为这样做的想法是一些外部代码将触发ajax调用,并使用
queue.add
作为回调。这样,返回数据将添加到队列中,如果在处理第一条数据时返回第二条数据,则在第一条数据完成后,它将添加到要处理的队列中。这是不可能的。当第一条数据仍在处理时,无法执行另一条返回的数据。它将等待,直到唯一的线程成为“空闲”来执行该工作。
队列.add
是冗余的。只需将处理程序直接附加到每个异步请求即可。可能的话!:)这完全取决于你所说的“加工”是什么意思。如果涉及动画(在某些文本中淡入淡出,滚动出一个隐藏元素),并且两个回调彼此靠近,动画很容易重叠。@beeglebug:不可能。当ajax回调正在运行时,任何动画代码都不会运行。类似地,当动画特温函数运行时,任何ajax回调都不会运行。setTimeout和setInterval并不神奇。它们不会产生线程。他们只是把事件排成队列。我认为每个人都把问题复杂化了,因为它使用了“线程”这个词。我相信OP只是意味着他需要在下一次回调开始之前完全完成每一次回调。我假设这是因为jQuery涉及到某种动画,它将使用计时器,因此看起来是多线程的(两个回调似乎可以同时运行)。@beeglebug-我不知道