Javascript或jQuery中的线程安全队列

at.*_*at. 12 javascript ajax jquery javascript-events

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

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

Jos*_*ton 25

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

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

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

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

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

  • 我认为每个人都过于复杂化这个问题,因为它使用了"线程"这个词.我相信OP只是意味着他需要在下一个回调开始之前完成每个回调.我假设因为涉及jQuery这是因为某种动画正在发生,它将使用定时器,因此看起来是多线程的(两个回调似乎同时运行). (6认同)

Kyl*_*ild 5

如果您唯一关注的是浏览器(因为您提到jQuery,我认为这是真的),您应该知道Javascript在浏览器中是单线程的.

  • 应该注意的是,即使对于Web工作者也没有必要担心代码并行运行,因为Web工作者不能与主线程或彼此共享变量.每个Web工作者本质上都是一个单线程事件循环,您可以使用类似于ajax调用的东西与它们进行通信.将它们视为服务器 - 在浏览器上运行.它们不是你的传统线索. (3认同)
  • 哇,我没有意识到这一点,看起来很奇怪...所以我可以发出100个AJAX请求,看起来这些请求似乎是异步的并且在不同的线程上,并且回调函数将一次调用一个? (2认同)