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

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

我有两个jQuery Deferred对象。

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

也许我正在寻找Deferred不提供的一些function?

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

 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/

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

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

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