11

我很惊讶,我无法找到明确的答案。因此,在jQuery中,你可以这样做:jQuery如何具有异步功能?

$(someElements).fadeOut(1000); 
$(someElements).remove(); 

其中,将开始淡出动画,但它完成在持续1秒执行前,该元素从DOM中移除。但是这怎么可能?我一直在阅读JavaScript是单线程的(另请参阅:Is JavaScript guaranteed to be single-threaded?)。我知道我可以做两种:

$(someElements).fadeOut(1000).promise().done(function() { 
    $(someElements).remove(); 
}); 

甚至更​​好:

$(someElements).fadeOut(1000, function() { 
    $(this).remove(); 
}); 

什么我不明白是怎么的JavaScript运行在一个“单线程”但我能够使用这些jQuery的函数异步执行,并且可以同时在不同的地方看到DOM变化。它是如何工作的? 这个问题不是:“我如何解决这个问题”。

+2

简短的回答:CSS动画或定时器。 – 2012-03-22 23:14:27

+0

我认为是因为jQuery使用动画队列,它在文档中的某处.. – gpasci 2012-03-22 23:14:55

回答

5

jQuery动画(以及几乎所有基于JavaScript的动画)都使用计时器来运行它们的动画。对.fadeOut()的调用只是启动动画,并且直到稍后一系列定时器操作完成时才会完成。

这仍然是单线程的。 .fadeOut()做动画的第一步,它为下一步设置一个计时器,然后您的javascript的其余部分(包括.remove())运行直到完成。当那个JavaScript线程完成并且计时器已经过去的时间时,计时器会触发并且动画的下一步发生。最后,当动画的所有步骤完成后,jQuery将调用动画的完成函数。这是一个回调,允许您在动画完成时执行某些操作。

那你是怎么解决这个问题:

$(someElements).fadeOut(1000, function() { 
    $(this).remove(); 
}); 

您使用动画完成的功能,只有当动画完成删除该项目。

+0

如果你想异步执行,你可能会考虑一个Web工作者或者如果你正在进行紧张的数据处理,可以使用(当前)实验性的River Trail OpenCL桥接器。 – FlavorScape 2012-03-22 23:26:20

+0

我其实更喜欢JSTween,因为它可以处理任何属性。 – FlavorScape 2012-03-22 23:28:12

+1

@FlavorScape - Web工作人员无法与DOM进行交互,因此他们对动画帮助不大。 – jfriend00 2012-03-22 23:43:58

1

在jQuery中有一个setInterval处理程序,它对所有注册的动画属性执行转换。如果你从AS3来了,把它作为一个enterFrame事件处理程序,或像在OpenGL一个Draw方法

+0

我认为在jQuery的最新版本中,它可能会使用requestAnimationFrame处理程序(由浏览器调度的事件)作为更新/绘制函数 – FlavorScape 2012-03-22 23:18:36

+0

requestAnimationFrame has进出jQuery。它已经有一段时间了,然后因为一些问题而被拔出。目前我没有在1.7版本中看到它有源代码可用。 – jfriend00 2012-03-22 23:21:12

+0

@ jfriend00你是正确的http://stackoverflow.com/questions/7999680/why-doesnt-jquery-use-requestanimationframe – FlavorScape 2012-03-22 23:27:23

0

您CA使用delay()等待一定的时间,或使用一个回调动画时,fadeOutanimate改变。 jQuery使用setTimeout来设置动画和队列。

0

与20年前的操作系统完成多任务的方式大致相同。没有线程,只有一些需要注意的事情和一个会根据列表关注事物的控制器。

单线程只是遍历列表遍历服务所有需要服务的东西。这里唯一的区别是有些事情有关联的等待期。他们在列表中,但被标记为在一段时间后才能服务。本质上这是一个非常基本的调度器实现。计算机上的内核做同样的事情。你的CPU只能同时执行几个程序,即使这样,也只是有点。操作系统内核必须以毫秒为单位决定谁在毫秒级获得关注(请参阅jiffies)。 Javascript的“内核”或者运行时间可以做同样的事情,但基本上就像在只有一个内核的CPU上运行一样。

这并不是谈论中断队列等CPU可以应付的事情,我不确定Javascript有没有类似的东西,但在简单的层面上,我认为这是一个公平的表示。

0

单线程与异步编程无关。 http://social.msdn.microsoft.com/Forums/uk/csharplanguage/thread/3de8670c-49ca-400f-a1dc-ce3a3619357d

如果你只有一个线程可以执行指令,它将不会/总是/正在执行。在那些空白的地方,这是更多工作的机会。异步编程只是将工作分解成能够重新进入的块,并且线程跳转到需要的地方。 (概念解释)

在这种情况下,您的问题可能更适合:为什么这不是阻止呼叫?在这种情况下,答案很明显,就是将UI动画与数据调用分开。整个JS环境不应该阻塞1秒,同时采取小片动画元素,它可能会检索或转换数据,排队等动画的其他元素,等等。