【问题标题】:Concurrency - does jquery handler preserve queue?并发 - jquery 处理程序是否保留队列?
【发布时间】:2012-02-29 16:32:54
【问题描述】:

我有这个简单的code

<a href="#" id="link1">Link1</a>
<a href="#" id="link2">Link2</a>​

$('#link1').click(function () {
    alert("First");
});

$('#link2').click(function () {
    alert("Second");    
});    
​

在用户点击 Link1(首先)和 Link2 的“远程”可能性中,相差 0,000000001 毫秒(我知道,这在现实中是不可能的,但只是知道),是#link2 的警报可能在#link1 的警报之前开始吗?

如果是的话,#link2 的阻塞处理程序直到#link1 的动作没有完成的解决方案是什么?

【问题讨论】:

  • 如果您不希望用户在 Link1 的处理程序完成之前单击 Link2,为什么不隐藏 Link2 直到 Link1 被单击并且处理程序完成?
  • 我知道.. 但假设我不能:)

标签: jquery concurrency thread-safety


【解决方案1】:

"...#link2 的警报是否可能在#link1 的警报之前开始?"

没有。如果点击实际上是按该顺序发生的,则事件将按该顺序触发。

JavaScript 是单线程的,事件系统是同步的。这保证了第一次点击的同步部分必须在第二次点击事件被允许之前完成。

如果异步代码被引入到第一次点击的处理程序中,那么第一次点击仍将首先开始,但如果第二次点击发生在第一次点击的异步之前,则可以开始第二次点击 代码运行。


要模拟超快速的点击序列,只需让代码触发事件即可。

var l1 = $('#link1');
var l2 = $('#link2');

l1.click();  // this alert will always come first
l2.click();

【讨论】:

  • 这很奇怪! JavaScript is single threaded,但是我可以做异步代码吗?
  • @markzzz:异步代码发生在单线程中。它只是安排在以后的时间。假设我们使用setTimeout 来为将来的10ms 安排一些代码。但我们也可以说紧跟在setTimeout 之后的代码是同步且长时间运行的,需要1000ms 才能完成。 setTimeout 回调中的代码不会按计划在10ms 中运行,而是需要等待之前长时间运行的代码完成。
  • 好的!但是,例如,如果我将 .animate() 放在我的 .click() 处理程序中,它会从“另一个线程”开始......你知道我的意思吗?
  • @markzzz:它不会在另一个线程中启动。动画只是在很短的时间间隔内对某些 CSS 属性进行的一系列异步预定更新。通常没有要阻塞的长时间运行的代码,因此任何其他需要运行的代码都可以在间隔之间完成。我认为动画的默认间隔是13ms,这通常有足够的时间让其他代码运行。但是假设有一些代码需要在采用500ms 的动画中间运行。您的动画将突然停止,直到该代码完成。
  • ...here's an example 的某些代码计划在将来用于10ms,但之后立即启动一些长时间运行的代码,这需要1000ms。您会看到计划的代码发生在1000ms 以上,而不是10ms。这是因为单线程。删除长时间运行的代码,它发生在更接近10ms
猜你喜欢
  • 1970-01-01
  • 2011-09-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-06-15
  • 1970-01-01
  • 2018-08-30
  • 1970-01-01
相关资源
最近更新 更多