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

tru*_*ktr 2 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?*/
Run Code Online (Sandbox Code Playgroud)

T.J*_*der 8

addClass不是异步的,并且没有任何环境可以花费任何大量时间来执行其工作.jQuery的各种操作都是异步的(阿贾克斯,效果,那种事)接受回调作为其API的一部分.

认为(不返回并重新阅读API)如果API函数没有回调,您可以假设操作是同步的.

相反的情况并非如此; jQuery有几个API函数(each例如)接受异步的回调,只是因为其他原因回调很方便.

在任何情况下,任何异步操作都应在文档中明确标识.

更新:解决更新后的问题:更正,之后的代码在完成addClass之前不会执行addClass.即使它需要一两秒钟(当然它不会,但让我们假装),addClass它将继续做它的事情,并返回到你的代码.后续代码在它发生之前不会运行,并且在发生这种情况时没有其他代码可以运行(因为Web浏览器上的JavaScript是单线程的,除非你使用web worker,甚至线程之间的协调也是明确的).

在某些操作中,您必须给浏览器一些时间来处理您告诉它要执行的操作.我试着想一个具体的例子,就像在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
Run Code Online (Sandbox Code Playgroud)

但除了某些特定操作之外,您不必这样做(并且不想这样做).对不起,我没有立即记住一个例子,但我们在这里谈论边缘案例.