Оказалось есть принципиальная разница в поведении.
Методы Deferred.always / Deferred.done / Deferred.fail возвращают тот же самый Deferred на котором были вызваны, а вот метод Deferred.then работает чуть посложнее.
Deferred.then - возвращает НОВЫЙ объект Deferred. Если функция обработчик который вы передали в Deferred.then возвращает Deferred, то Deferred.then вернет именно этот самый Deferred. Если функция обработчик который вы передали в Deferred.then возвращает значение, то Deferred.then вернет выполненый Deferred с этим значением.
Соответственно, принципиальное различие между методами Deferred.always / Deferred.done / Deferred.fail и Deferred.then в том, что на втором можно построить цепочки вызовов для последовательного асинхронного выполнения своего кода, а вот на первых так не получится.
Примерd = $.Deferred(function(def) {
setTimeout(function() {
console.log(1);
def.resolve();
}, 1000);
});
d.then(function() {
var def = $.Deferred();
setTimeout(function() {
console.log(2);
def.resolve();
}, 1000);
return def;
})
.then(function() {
var def = $.Deferred();
setTimeout(function() {
console.log(3);
def.resolve();
}, 1000);
return def;
})
.then(function() {
var def = $.Deferred();
setTimeout(function() {
console.log(4);
def.resolve();
}, 1000);
return def;
})
.then(function() {
var def = $.Deferred();
setTimeout(function() {
console.log(5);
def.resolve();
}, 1000);
return def;
});