我很惊讶我找不到明确的答案。所以,在jQuery中,你可以这样做:
$(someElements).fadeOut(1000);
$(someElements).remove();
其中,将启动fadeOut动画,但在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的变化。它是如何工作的? 这个问题不是:“我该如何解决这个问题。”
答案 0 :(得分:6)
jQuery动画(以及几乎所有基于javascript的动画)使用计时器来运行他们的动画。对.fadeOut()
的调用只是动画的动画,直到一段时间后完成一系列计时器操作才能完成。
这仍然是单线程的。 .fadeOut()
执行动画的第一步,它为下一步设置计时器,然后其余的javascript(包括.remove()
)运行直到完成。当javascript线程结束并且计时器的时间流逝时,计时器将触发并且动画的下一步发生。最后,当动画的所有步骤都完成后,jQuery会调用动画的完成函数。这是一个允许你在动画完成时做某事的回调。
这就是你解决这个问题的方法:
$(someElements).fadeOut(1000, function() {
$(this).remove();
});
您可以使用动画完成功能,仅在动画完成时删除该项目。
答案 1 :(得分:1)
jQuery中有一个setInterval处理程序,它对所有已注册的动画属性执行转换。如果您来自as3,请将其视为EnterFrame处理程序,或者像OpenGL中的Draw方法
答案 2 :(得分:0)
您可以使用delay()
等待一段时间或使用动画回调,并使用fadeOut
更改animate
。
jQuery使用setTimeout来设置动画和队列。
答案 3 :(得分:0)
与20年前的操作系统执行多任务的方式大致相同。没有线程,只有一个需要注意的事项列表和一个控制器,可以根据列表注意事项。
单个线程只需遍历列表就可以为所有需要服务的东西提供服务。这里唯一的区别是有些东西有一个等待期。它们在列表中,但仅在一段时间后才被标记为服务。它本质上是一个非常基本的调度程序实现。计算机上的内核也做同样的事情。你的CPU只能同时执行几个程序,即使这样,也只能执行一些程序。操作系统内核必须决定谁以毫秒为单位获得关注(参见jiffies)。 Javascript的“内核”或运行时做同样的事情,但基本上就像它在只有一个核心的CPU上运行。
这里没有讨论中断队列等内容以及CPU可以处理的问题,而且我不确定Javascript是否有任何模拟,但在简单的层面上,我认为这是一个公平的表示。
答案 4 :(得分:0)
单线程与异步编程无关。 http://social.msdn.microsoft.com/Forums/uk/csharplanguage/thread/3de8670c-49ca-400f-a1dc-ce3a3619357d
如果您只有一个可以执行指令的线程,它将不会/始终/正在执行。在那些空白点,这是更多工作的机会。异步编程只是将工作分解为具有重新进入能力的块,并且线程跳转到需要它的位置。 (概念解释)
在这种情况下,您的问题可能更合适:为什么这不是阻止通话?在这种情况下,答案非常清楚,它是将UI动画与数据调用分开。整个JS环境不应该阻塞1秒钟,同时采用小切片来动画可以检索或转换数据的元素,为其他元素排队动画等等。