jQuery Deferred not calling the resolve/done callbacks in order

心不动则不痛 提交于 2019-11-26 22:02:32

问题


Code example: http://jsfiddle.net/MhEPw/1/

I have two jQuery Deferred objects.

I want to have more than one 'async' request happening - and after they all run I want the callbacks (the .done functions) to be run in order they were specified in. Unfortunately they don't run in order.

Maybe I am looking for some functionality here that Deferred doesn't provide?


回答1:


What you need to do is link all of your request with one master deferred object and register all of your callbacks on its promise. The master deferred object would need to listen to the individual requests and resolve accordingly. The simplest way to achieve this would be to define all of the deferred objects up front to avoid the chicken and egg problem:

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);

Fiddle: http://jsfiddle.net/pVVad/

Changing the order of deferred objects definitions is possible but it would make the example much more complicated.




回答2:


Adam, if you change your "setTimeout" by a "for" you can see that is executed in order, setTimeout adds a "trigger" to call "another action", this "another action" is executed in the time that you have specified, but the setTimeout calls is executed in order.

If you don't use setTimeout, your script will be executed in order.



来源:https://stackoverflow.com/questions/5159304/jquery-deferred-not-calling-the-resolve-done-callbacks-in-order

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!