Pull to refresh

Comments 15

Спасибо! А то вложенностью колбэков действительно можно быстро запутаться
Не нравится мне вот этот код:
$.when.apply(this, promises)
В качестве this в when передается какой-то случайный объект… Лучше уж писать $.when.apply(null, promises) или $.when.apply($, promises).
Параллельное выполнение

Запускает все асинхронные операции одновременно и переходит к выполнению следующего колбэка только тогда когда будут выполнены все параллельные операции.


К сожалению не совсем так. Из-за включенного по умолчанию в современных браузерах http pipelining, запросы будут выполняться последовательно. Т.е. браузер не отправит новый запрос, пока не выполнится предыдущий.
На своем проекте недавно с этим столкнулся. Там отправляются одновременно несколько ajax запросов на сервер, и, как оказалось во многих броузерах, если один из запросов «задумается», то следующие не начинают выполняться.
Pipelining же как раз чтобы избежать такого, нет? «HTTP requests are sent on a single TCP connection without waiting for the corresponding responses». Единственное что «methods like POST should not be pipelined. Sequences of GET and HEAD requests can always be pipelined»
Разве в chrome не отключено по умолчанию? В firefox отключено, судя по монитору запросов в chrome тоже.
Примеры хорошие, но на мой взгляд есть небольшая подмена понятий в Deferred Object и Promise Object (который я бы переводил как промис). Последний получается из первого путём вызова метода promise на объекте jQuery.Deferred:
function example() {
  var dfd = new jQuery.Deferred();
 
  // Resolve
  // Reject
  // Notify
 
  // Return the Promise so caller can't change the Deferred
  return dfd.promise();
}

Сам Promise Object согласно справке:
This object provides a subset of the methods of the Deferred object (then, done, fail, always, pipe, and state) to prevent users from changing the state of the Deferred.

Т.е., в моём понимании, Promise Object это результат работы, а Deferred Object — способ повлиять на неё.
Напутал немного с понятиями. Спасибо.
Я думаю тут и без схем все понятно. Есть done-колбэки, есть fail-колбэки. В цепочке последовательно выполняются done-колбэки, до тех пор пока не произойдет ошибка. Тогда начинают выполняться все последующие fail-колбэки. Как поменять такое поведение я описал в двух последних примерах. Еще есть always-колбэки, которые выполняются в любом случае. И еще есть progressCallback — это отдельная история.
Вот небольшая шпаргалка.
done(doneCallback, doneCallback, ...)
fail(failCallbacks, failCallback, ...)
then(doneCallback, failCallback)
always(alwaysCallback, alwaysCallback, ...)
Ничего ваша шпаргалка не проясняет.
Придётся лезть в сорцы.
Собственно, по вашей ссылке все уже объяснено.

Методы done, fail и always навешивают обработчик на текущий промиз, и возвращают его же. Поэтому их нельзя использовать для того, чтобы прервать поток обработки — следующий обработчик отработает сразу после окончания действия предыдущего.

Метод then возвращает новый промиз, и заданные через него обработчики могут вернуть другие промизы, что позвляет управлять потоком обработки, как это было продемонстрировано в пунктах «Остановка выполнения цепочки после обработки ошибки» и в пункте «Продолжение выполнения цепочки после обработки ошибки».
По моей ссылке нарисована реализация deferred в python twisted.

То, что обработчик, указанный в then резольвит какой-то новый промиз, и его можно разрезольвить созданным промизом — это вот было не очевидно.
И это появиолсь только в jquery 1.8 о чём в статье ни слова.

В документации обработчкики для .done, .fail, .always называются Callback, а для .then — Filters.
В статье они все перемешаны в кучу, и это не добавляет понимания.

И тутже встаёт вопрос — анахуа собственно перемешывать .fail и .then а потом пытаться прерывать цепочку?
И тутже встаёт вопрос — анахуа собственно перемешывать .fail и .then а потом пытаться прерывать цепочку?

Потомучто при использовании fail цепочка не останавливается. Такая вот особенность у библиотеки. jsfiddle.net/LDFTF/1/
То, что обработчик, указанный в then резольвит какой-то новый промиз, и его можно разрезольвить созданным промизом — это вот было не очевидно.
Но об этом на каждом углу пишут, а статья автора все-таки про примеры использования, а не очередной пересказ документации.
Sign up to leave a comment.