2014-10-23 2 views
8

Короче говоря, я хотел бы иметь один общий обратный вызов, который всегда срабатывает в случае успешного вызова ajax, за которым следуют отдельные функции обратного вызова в зависимости от того, где вызывается метод.Цепочка нескольких обработанных() обратных вызовов к тому же отложенному обещанию

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

var dfd = $.Deferred(), 
    promise = dfd.promise(); 

promise.done(function(){ 
    console.log(1); 
}).done(function(){ 
    console.log(2); 
}); 

dfd.resolve(); 

http://jsfiddle.net/4ax4nxbh/

ответ

12

Это правильно и документально использование отложенного объекта в JQuery. Документация clearly states:

Обратные вызовы выполняются в том порядке, в котором они были добавлены.

Он работает по-разному в других библиотеках обещают и в целом .then предпочтительно .done в любом случае (объяснено позже в ответ). Однако, учитывая, что вы используете обещания jQuery, он будет стекать только штрафом последовательно, если они синхронны.

Так что прямой ответ на ваш вопрос - да.

Однако, вы также можете сделать это с асинхронным кодом и он цепь лучше .then:

promise.then(function(){ 
    console.log(1); 
}).then(function(){ 
    console.log(2); 
}).then(function(){ 
    return $.get(...); 
}).then(function(){ 
    console.log(3); // this always executes after the $.get finishes. 
}); 

В принципе, done добавляет обработчик и возвращает то же обещание и .then возвращает новое обещание прикованного из последний. В общем, я бы использовал только .done для прекращения цепей, и если вы хотите сохранить возвращаемое значение (аргумент function(){)

+0

Я надеялся, что вы найдете эту тему;) Когда вы говорите «обычно. все равно. Я полагаю, что вы ссылаетесь на цепочку, а не на 'done' vs' then' вообще? Я думаю, что наиболее подходящий подход, основанный на вашем комментарии, будет заключаться в использовании 'then()', за которым следует «завершающий» 'done()', хотя я имею дело только с синхронным кодом в этом случае? – Johan

+0

@ Johan вообще я предпочитаю 'then'' to' done' при использовании новых библиотек обещаний. В jQuery, с другой стороны, использование '.done' для прекращения цепочки выгодно - так что да, опять же это не самая большая проблема с обещаниями jQuery. –

+1

Согласовано. Спасибо, что узнали мне разницу между ними! – Johan

Смежные вопросы