jQuery Отложено не вызывать обратные вызовы resol /done по порядку

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

У меня есть два отложенных объекта jQuery.

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

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

2 ответа

Решение

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

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/

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

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

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

Другие вопросы по тегам