在jQuery(在非常慢的计算机上)执行另一个异步函数之前,如何确定异步函数是否已完成?

时间:2011-05-16 06:43:10

标签: javascript jquery asynchronous

例如,假设我使用.addClass()方法。你不能追加回调(例如你不能做$('...')。addClass('...')。load('...'))。

在大多数情况下,您可以在使用.load()之前重新调用函数,然后就可以了。

但是如果我有一台使用.addClass()需要5秒钟的超慢速计算机怎么办?如何在.addClass()完成之后执行另一个异步函数 ,或者在任何 JavaScript异步函数完成之后?

编辑:我错了,.addClass 不是异步。

那么,那就是确定:

$('foo').addClass('');
/*this code here will not execute UNLESS the previous line is absolutely finished?*/

3 个答案:

答案 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)

在我将后续的ajax / rendering放入setTimeout之前,

addClass并没有完成。它必须在某种程度上是异步的。我试图在主体上添加一个类(用于加载gif),它只是添加了&#34;类&#34;没有值的属性。当后面的代码放入setTimeout时,它就完成了。这是在Chrome中,差不多4年后......

答案 2 :(得分:2)

addClass不是异步的。在jQuery中,异步方法允许您指定一个回调函数,该函数将在方法完成时调用。如果没有接受回调的方法签名,那么该方法可能是同步的。