jQuery延迟不按顺序调用resolve / done回调

时间:2011-03-01 19:25:45

标签: javascript jquery ajax asynchronous jquery-deferred

代码示例:http://jsfiddle.net/MhEPw/1/

我有两个jQuery Deferred对象。

我想要发生多个“异步”请求 - 并且在它们全部运行之后我希望回调(.done函数)按照指定的顺序运行。不幸的是它们不按顺序运行。

也许我在寻找Deferred不提供的功能?

2 个答案:

答案 0 :(得分:5)

您需要做的是将所有请求与一个主延迟对象链接,并在其承诺上注册所有回调。主延迟对象需要监听各个请求并相应地解决。实现这一目标的最简单方法是预先定义所有延迟对象,以避免鸡和蛋的问题:

var d1 = $.Deferred();
var d2 = $.Deferred();
var def = $.when(d1, d2);

def.done(function() {
    alert(1);
});
setTimeout(function() {
    d1.resolve();
}, 3000);

def.done(function() {
    alert(2);
});
setTimeout(function() {
    d2.resolve();
}, 1000);

小提琴:http://jsfiddle.net/pVVad/

更改延迟对象定义的顺序是可能的,但这会使示例更加复杂。

答案 1 :(得分:1)

Adam,如果你用“for”改变你的“setTimeout”你可以看到按顺序执行,setTimeout添加一个“触发器”来调用“另一个动作”,这个“另一个动作”在那个时候被执行你已经指定了,但是setTimeout调用是按顺序执行的。

如果您不使用setTimeout,您的脚本将按顺序执行。