jquery - 等到函数完成

时间:2011-04-17 11:55:38

标签: jquery ajax asynchronous

如果我正确理解jquery和javqascript,它就是异步的。我无法理解的是,如果只是ajax部分,负载和get ...或者一般的所有内容都是异步的。

例如,如果我需要在表单中附加列表菜单并具有:

$('#id').append("<option value='1'>1</option>") - etc., in this demo the <select id="category> is missing

现在我想:

$('#category option[value="1"]').attr('selected', 'selected');

当然,我希望在菜单被添加之后选择值1,而不是之前,因为它不存在。

我想知道等待追加的脚本是否完成,并且一个接一个地写两条线或者是否需要在第一行上放置一些回调函数以便第二行在追加完成后执行?

它可以在我的浏览器上运行,但是我有一台快速的计算机,我担心它会在选择偶数附加之前尝试选择一些缓慢的计算机,如果它是异步的话。

或者只是ajax调用asynchronius?这是显而易见的初学者,但是我没有找到好的关键词来确定这个基本的东西,所以我在这里问。

4 个答案:

答案 0 :(得分:5)

只有AJAX,setTimeout,setInterval和事件处理程序是异步的。其他一切都是同步运行的。

所以你可以安全地假设你的第一行已经执行了第二行。

确定某人是否异步执行的一种好方法是检查是否传递了回调函数。如果你这样做,那么执行时间取决于外部因素(网络速度),或者需要一些时间来执行(例如,淡化元素),它可能异步执行。但是,$.each之类的东西会同步运行,即使它与回调函数一起使用也是如此。但在这种情况下,没有什么地方执行速度减慢或依赖于外部因素,因此没有理由将其异步化。

答案 1 :(得分:2)

这是延迟对象的用武之地,以及为什么最新的jQuery非常适合最终拥有它们:

例如:

$.when(appendMenu()).then
(
function ()
    {
    $('#category option[value="1"]').attr('selected', 'selected');
    }
);

function appendMenu ()
{
var dfd = $.Deferred();
$('#id').append("<option value='1'>1</option>");
dfd.resolve();
return dfd.promise();
}

http://api.jquery.com/category/deferred-object/

该概念基本上允许您控制何时应根据承诺策略执行代码 - 直到延迟对象说完成后,其他代码将不会运行。

但老实说,我很难想象为什么这两个简单的呼叫不会瞬间发生;你确定你没有其他一些代码可以减慢这个过程,因为我通常可以在没有延迟对象的情况下逃脱那些类型的调用。

答案 2 :(得分:0)

有人告诉我,大多数浏览器使用单个线程来运行javascript(除非你在Chrome中明确启用了多线程模式)

答案 3 :(得分:0)

或者你可以这样做:

$('#id').append("<option value='1' selected='selected'>1</option>")