jQuery Отложено не вызывать обратные вызовы resol / done по порядку - PullRequest
8 голосов
/ 01 марта 2011

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

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

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

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

Ответы [ 2 ]

5 голосов
/ 01 марта 2011

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

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 голос
/ 01 марта 2011

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

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

...