Javascript或jQuery中的线程安全队列

时间:2011-01-17 08:58:27

标签: javascript ajax javascript-events jquery

我有许多异步AJAX调用,其结果将被处理。处理发生的顺序无关紧要,但结果需要一次处理一个。所以我想简单地做我的AJAX调用,他们只是把他们的结果放在一个队列中。然后应该在单个线程上处理该队列。这样,结果可以尽快一次处理一次。

最好的方法是什么?我正在使用jQuery,很高兴利用它为此提供的任何设施。

4 个答案:

答案 0 :(得分:25)

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

像Javascript这样的事件驱动语言在队列的基础上运行。后台的Javascript本质上有一个巨大的队列,事件和异步响应被推入。完成特定的处理后,将处理队列中的下一个项目。

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

使用Web Workers可以在(更新)版本的Javascript中实现多线程,但这些版本是明确选择加入的。如果你有兴趣,请查看它们。

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

答案 1 :(得分:5)

如果您唯一关注的是浏览器(因为您提到jQuery,我认为这是真的),您应该知道Javascript is single-threaded in browsers

答案 2 :(得分:0)

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

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

最后,将if(alreadyRunning) { return; }之类的内容添加到该函数的顶部,以阻止它同时执行多个操作,并且您已获得单线程队列。

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

答案 3 :(得分:0)

您可能需要查看Event messaging between JavaScript objects.

我使用了一个类似于博客文章的实现,其中包含一个名为ajaxMonitor的jQuery插件。

一旦调用来自AJAX请求的任何回调,它的工作方式就会更新HTML表。回调发生异步。

AJAX的本质意味着异步。因此,在成功回调你的AJAX请求时处理你的队列,我相信会完成你想要的。