2013-03-15 2 views
3

Есть ли способ связать JQuery Отсрочки для выполнения один за другим без обратных пирамид?JQuery Chaining Отложенные без пирамид обратного вызова

Прямо сейчас я должен сделать что-то вроде этого:

$.Deferred(function(dfd) { 
    setTimeout(function() { 
     console.log('Foo'); 
     dfd.resolve(); 
    }, 1000); 
}) 
.done(function() { 
    $.Deferred(function(dfd) { 
     console.log('Bar'); 
     dfd.resolve(); 
    }).done(function() { 
     console.log('done'); 
    }); 
}); 

Выход: Foo, Bar, сделано

Я хочу, чтобы иметь возможность сделать что-то вроде этого:

$.Deferred(function(dfd) { 
    setTimeout(function() { 
     console.log('Foo'); 
     dfd.resolve(); 
    }, 1000); 
}) 
.then($.Deferred(function(dfd) { 
    console.log('Bar'); 
    dfd.resolve(); 
})) 
.done(function() { console.log('done') }); 

Нежелательный выход: Бар, Foo, сделано

Спасибо.

ответ

1

Проблема с вашим кодом заключается в том, что вы передаете .then() объект jQuery, тогда как он ожидает function. Этот код выполняет foo-bar-done по мере необходимости.

$.Deferred(function(dfd) { 
    setTimeout(function() { 
     console.log('Foo'); 
     dfd.resolve(); 
    }, 1000); 
}).then(function(){ 
    return $.Deferred(function(dfd) { 
     console.log('Bar'); 
     dfd.resolve(); 
    }); 
}).done(function() { console.log('done') }); 
+0

Примечание: Эта функция работает только в JQuery 1.8+. До этого вам нужно использовать '.pipe()'. – MgSam

+0

И до 1.6/1.7 '.pipe()' не будет работать. Если не указано, я предполагаю, что вопросы jQuery относятся к последней версии, и в этом случае этот ответ правильный и должен быть помечен как таковой. –

+0

Извините, я не маркировал его, потому что после дальнейшего тестирования я обнаружил, что он не работает. Первая причина заключалась в версии JQuery, но второй причиной было отсутствие ключевого слова 'return', которое с тех пор исправлено. – MgSam

0

Я думаю, вы хотите использовать $.when().

Что-то, как это должно работать:

var d1 = $.Deferred(function(dfd) { 
    setTimeout(function() { 
     console.log('Foo'); 
     dfd.resolve(); 
    }, 1000); 
}); 

var d2 = $.Deferred(function(dfd) { 
    setTimeout(function() { 
     console.log('Bar'); 
     dfd.resolve(); 
    }, 2000); 
}); 

$.when(d1, d2).then(function() {console.log('done')}); 
Смежные вопросы