JQuery Отложено, не вызвав разрешения/сделанные обратные вызовы в порядке

Пример кода: http://jsfiddle.net/MhEPw/1/

У меня есть два объекта JQuery Deferred.

Я хочу, чтобы выполнялось несколько запросов async - и после их запуска я хочу, чтобы обратные вызовы (функции .done) запускались, чтобы они были указаны. К сожалению, они не запускаются по порядку.

Может быть, я ищу какую-то функциональность здесь, которую Deferred не предоставляет?

Ответ 1

Что вам нужно сделать, это связать весь ваш запрос с одним основным отложенным объектом и зарегистрировать все ваши обратные вызовы по его обещанию. Мастер отложенного объекта должен будет прослушивать отдельные запросы и соответствующим образом решать. Самый простой способ достичь этого - определить все отложенные объекты спереди, чтобы избежать проблемы с курицей и яйцом:

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/

Изменение порядка определения отложенных объектов возможно, но это сделает этот пример намного сложнее.

Ответ 2

Адам, если вы измените свой "setTimeout" на "для", вы увидите, что это выполняется по порядку, setTimeout добавляет "триггер" для вызова "другого действия", это "другое действие" выполняется в то время, когда вы указали, но вызовы setTimeout выполняются в порядке.

Если вы не используете setTimeout, ваш script будет выполнен в порядке.