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