Комментарии 15
Спасибо! А то вложенностью колбэков действительно можно быстро запутаться
+2
Не нравится мне вот этот код:
$.when.apply(this, promises)
В качестве this в when передается какой-то случайный объект… Лучше уж писать $.when.apply(null, promises)
или $.when.apply($, promises)
.+10
Параллельное выполнение
Запускает все асинхронные операции одновременно и переходит к выполнению следующего колбэка только тогда когда будут выполнены все параллельные операции.
К сожалению не совсем так. Из-за включенного по умолчанию в современных браузерах http pipelining, запросы будут выполняться последовательно. Т.е. браузер не отправит новый запрос, пока не выполнится предыдущий.
На своем проекте недавно с этим столкнулся. Там отправляются одновременно несколько ajax запросов на сервер, и, как оказалось во многих броузерах, если один из запросов «задумается», то следующие не начинают выполняться.
-1
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»
0
Разве в chrome не отключено по умолчанию? В firefox отключено, судя по монитору запросов в chrome тоже.
0
Запросы будут выполняться последовательно в том случае, если они обращаются к одному и тому же url:
Последовательно
Параллельно
Последовательно
Результат![](https://habrastorage.org/r/w780q1/getpro/habr/comment_images/6c4/78e/f89/6c478ef896c6683237d951683be504c5.jpg)
![](https://habrastorage.org/getpro/habr/comment_images/6c4/78e/f89/6c478ef896c6683237d951683be504c5.jpg)
Параллельно
Результат![](https://habrastorage.org/r/w780q1/getpro/habr/comment_images/e42/27f/59a/e4227f59ad9ac4e1a2c6a3865a72e092.jpg)
![](https://habrastorage.org/getpro/habr/comment_images/e42/27f/59a/e4227f59ad9ac4e1a2c6a3865a72e092.jpg)
+1
Примеры хорошие, но на мой взгляд есть небольшая подмена понятий в Deferred Object и Promise Object (который я бы переводил как промис). Последний получается из первого путём вызова метода promise на объекте jQuery.Deferred:
Сам Promise Object согласно справке:
Т.е., в моём понимании, Promise Object это результат работы, а Deferred Object — способ повлиять на неё.
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 — способ повлиять на неё.
+3
А можно как-нибудь понагляднее про цепочку колбэков и еррбэков
Что-нибудь типа такого: twistedmatrix.com/documents/current/_images/deferred-process.png
Что-нибудь типа такого: twistedmatrix.com/documents/current/_images/deferred-process.png
+1
Я думаю тут и без схем все понятно. Есть done-колбэки, есть fail-колбэки. В цепочке последовательно выполняются done-колбэки, до тех пор пока не произойдет ошибка. Тогда начинают выполняться все последующие fail-колбэки. Как поменять такое поведение я описал в двух последних примерах. Еще есть always-колбэки, которые выполняются в любом случае. И еще есть progressCallback — это отдельная история.
Вот небольшая шпаргалка.
Вот небольшая шпаргалка.
done(doneCallback, doneCallback, ...)
fail(failCallbacks, failCallback, ...)
then(doneCallback, failCallback)
always(alwaysCallback, alwaysCallback, ...)
0
Собственно, по вашей ссылке все уже объяснено.
Методы done, fail и always навешивают обработчик на текущий промиз, и возвращают его же. Поэтому их нельзя использовать для того, чтобы прервать поток обработки — следующий обработчик отработает сразу после окончания действия предыдущего.
Метод then возвращает новый промиз, и заданные через него обработчики могут вернуть другие промизы, что позвляет управлять потоком обработки, как это было продемонстрировано в пунктах «Остановка выполнения цепочки после обработки ошибки» и в пункте «Продолжение выполнения цепочки после обработки ошибки».
Методы done, fail и always навешивают обработчик на текущий промиз, и возвращают его же. Поэтому их нельзя использовать для того, чтобы прервать поток обработки — следующий обработчик отработает сразу после окончания действия предыдущего.
Метод then возвращает новый промиз, и заданные через него обработчики могут вернуть другие промизы, что позвляет управлять потоком обработки, как это было продемонстрировано в пунктах «Остановка выполнения цепочки после обработки ошибки» и в пункте «Продолжение выполнения цепочки после обработки ошибки».
0
По моей ссылке нарисована реализация deferred в python twisted.
То, что обработчик, указанный в then резольвит какой-то новый промиз, и его можно разрезольвить созданным промизом — это вот было не очевидно.
И это появиолсь только в jquery 1.8 о чём в статье ни слова.
В документации обработчкики для .done, .fail, .always называются Callback, а для .then — Filters.
В статье они все перемешаны в кучу, и это не добавляет понимания.
И тутже встаёт вопрос — анахуа собственно перемешывать .fail и .then а потом пытаться прерывать цепочку?
То, что обработчик, указанный в then резольвит какой-то новый промиз, и его можно разрезольвить созданным промизом — это вот было не очевидно.
И это появиолсь только в jquery 1.8 о чём в статье ни слова.
В документации обработчкики для .done, .fail, .always называются Callback, а для .then — Filters.
В статье они все перемешаны в кучу, и это не добавляет понимания.
И тутже встаёт вопрос — анахуа собственно перемешывать .fail и .then а потом пытаться прерывать цепочку?
0
И тутже встаёт вопрос — анахуа собственно перемешывать .fail и .then а потом пытаться прерывать цепочку?
Потомучто при использовании fail цепочка не останавливается. Такая вот особенность у библиотеки. jsfiddle.net/LDFTF/1/
0
То, что обработчик, указанный в then резольвит какой-то новый промиз, и его можно разрезольвить созданным промизом — это вот было не очевидно.Но об этом на каждом углу пишут, а статья автора все-таки про примеры использования, а не очередной пересказ документации.
+1
Зарегистрируйтесь на Хабре, чтобы оставить комментарий
JQuery Deferred — примеры использования