Подтвердить что ты не робот

JQuery: В чем разница между отложенными .always() и отложенными. then()?

Мне кажется, что обе делают то же самое.

Docs:

4b9b3361

Ответ 1

Казалось бы, deferred.then() позволяет передавать два отдельных обратных вызова для успеха и неудачи, тогда как deferred.always() принимает n количество обратных вызовов, которые будут вызваны независимо от результата начального события.

Я бы сказал, используйте deferred.always() в случаях, когда успех/неудача начального события не важны

Ответ 2

С .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();
});

Ответ 3

До jQuery 1.8: .always(fn) эквивалентно .then(fn, fn)

Как и в jQuery 1.8: .always(fn) похож на .then(fn, fn), но он отличается тем, что возвращается (см. http://api.jquery.com/deferred.then/ для подробностей )

Ответ 4

Большим преимуществом 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
});