zkrvndm
@zkrvndm
Архитектор решений

В чем отличие Deferred.always / Deferred.done / Deferred.fail от Deferred.then?

Отвечать не нужно, это чисто заметка для себя и остальных.
  • Вопрос задан
  • 88 просмотров
Пригласить эксперта
Ответы на вопрос 1
zkrvndm
@zkrvndm Автор вопроса
Архитектор решений
Оказалось есть принципиальная разница в поведении.

Методы 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;
});
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы