例如,假设我使用.addClass()方法。你不能追加回调(例如你不能做$('...')。addClass('...')。load('...'))。
在大多数情况下,您可以在使用.load()之前重新调用函数,然后就可以了。
但是如果我有一台使用.addClass()需要5秒钟的超慢速计算机怎么办?如何在.addClass()完成之后执行另一个异步函数 ,或者在任何 JavaScript异步函数完成之后?
编辑:我错了,.addClass 不是异步。那么,那就是确定:
$('foo').addClass('');
/*this code here will not execute UNLESS the previous line is absolutely finished?*/
答案 0 :(得分:8)
addClass
不是异步的,并且没有任何环境可以花费任何大量时间来执行其工作。 jQuery的各种操作 异步(ajax,效果,那种东西)接受回调作为其API的一部分。
我认为(没有返回并重新阅读API)如果API函数没有回调,您可以假设操作是同步的。
相反的情况并非如此; jQuery有几个API函数(例如each
)接受不是异步的回调,只是因为其他原因回调很方便。
在任何情况下,任何异步操作都应在文档中明确标识。
更新:解决更新后的问题:正确,addClass
之后的代码在addClass
完成之前不会执行。即使它花了一两秒钟(当然它没有,但让我们假装),addClass
将通过做它的事情,并返回到你的代码。后续代码在它发生之前不会运行,并且在发生这种情况时没有其他代码可以运行(因为Web浏览器上的JavaScript是单线程的,除非你使用web workers,甚至线程之间的协调是明确的)。 / p>
在某些操作中,您必须给浏览器一些时间来处理您告诉它要执行的操作。我试着想一个具体的例子,就像在IE中添加表单字段一样。绝对不简单的事情。在那些罕见的情况下,您可以确保通过setTimeout
明确屈服于浏览器,让浏览器有机会做到这一点:
doSomethingTheBrowserHasToThinkAbout();
setTimeout(function() {
// Now you know the browser's had time to think about it
doSomethingElse();
}, 0); // <== Won't really be 0, most browsers clamp this to 5-10ms minimum
但除了某些特定操作外,您不必这样做(并且不想这样做)。对不起,我没有立即记住一个例子,但我们在这里谈论边缘案例。
答案 1 :(得分:3)
addClass并没有完成。它必须在某种程度上是异步的。我试图在主体上添加一个类(用于加载gif),它只是添加了&#34;类&#34;没有值的属性。当后面的代码放入setTimeout时,它就完成了。这是在Chrome中,差不多4年后......
答案 2 :(得分:2)
addClass
不是异步的。在jQuery中,异步方法允许您指定一个回调函数,该函数将在方法完成时调用。如果没有接受回调的方法签名,那么该方法可能是同步的。