Мне кажется, что обе делают то же самое.
Docs:
Казалось бы, deferred.then()
позволяет передавать два отдельных обратных вызова для успеха и неудачи, тогда как deferred.always()
принимает n
количество обратных вызовов, которые будут вызваны независимо от результата начального события.
Я бы сказал, используйте deferred.always()
в случаях, когда успех/неудача начального события не важны
С .then()
вы можете предоставить индивидуальный обратный вызов, если разрешен $.Deferred
(done
), а другой - при отклонении $.Deferred
(fail
).
.always()
, с другой стороны, позволяет вам обеспечить обратный вызов, который всегда выполняется, независимо от того, был ли $.Deferred
разрешен или отклонен. Другими словами, в этом обратном вызове не имеет значения, завершился ли вызов AJAX или был успешно выполнен.
Я стараюсь поместить код в .always()
, когда я хочу, чтобы этот код запускался каждый раз и независимо от того, успешно ли был разрешен $.Deferred
или нет. Например, чтобы очистить индикатор загрузки AJAX или скрыть индикатор выполнения. Используя .then()
, у вас будет что-то вроде этого:
$.get("/some/url").then(function () { // done callback
$(".progress-bar").hide();
}, function () { // fail callback
$(".progress-bar").hide();
});
В то время как если вы использовали .always()
, вам нужен только один обратный вызов, потому что вы всегда хотите скрыть индикатор выполнения, независимо от того, было ли разрешено или отклонено $.Deferred
:
$.get("/some/url").always(function () {
$(".progress-bar").hide();
});
До jQuery 1.8: .always(fn)
эквивалентно .then(fn, fn)
Как и в jQuery 1.8: .always(fn)
похож на .then(fn, fn)
, но он отличается тем, что возвращается (см. http://api.jquery.com/deferred.then/ для подробностей )
Большим преимуществом then
(начиная с версии 1.8) является возможность целенаправленной задачи явно, поскольку она возвращает обещание, которое будет разрешено с результатом обратного вызова (-ов)
Пример из документации:
var request = $.ajax( url, { dataType: "json" } ),
chained = request.then(function( data ) {
return $.ajax( url2, { data: { user: data.userId } } );
});
chained.done(function( data ) {
// data retrieved from url2 as provided by the first request
});