8

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

我有两个 jQuery Deferred 对象。

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

也许我在这里寻找 Deferred 不提供的一些功能?

4

2 回答 2

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/

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

于 2011-03-01T20:11:43.667 回答
1

亚当,如果您将“setTimeout”更改为“for”,您可以看到它按顺序执行,setTimeout 添加了一个“触发器”来调用“另一个动作”,这个“另一个动作”在您指定的时间执行,但 setTimeout 调用是按顺序执行的。

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

于 2011-03-01T19:53:48.097 回答