Comments 28
Лучше сразу на JS бы показывали. Зачем использовать два языка, при чём более популярный скрывать под спойлеры?
+16
Не редко приходится встречать утверждение, что Deferred может использоваться не только вкупе с асинхронными функциями, но и с синхронными. На данный момент я не встречал задач, где это может пригодиться.
Это может пригодиться, если на данный момент вы работаете с синхронным API, но у вас есть подозрение (или желание), что через какое-то время придется перейти на асинхронное. Например, сейчас храните данные в localStorage, но есть желание попробовать IndexedDB.
+2
Спасибо. Вы подтвердили мои предположения.
0
Именно по этому во всех promise библиотеках есть враппер функции, который проверяет вернула ли она promise или результат.
Пример:
Пример:
a = ->
123
b = ->
dfd = new $.Deferred()
dfd.resolve 123
dfd.promise()
# работа с синхронной функцией
$.when(a).then ->
# аналогична работе с promise
$.when(b).then ->
+1
Уж извините, статья полезная, но поставил 0, т.к. CoffeeScript режет глаза.
Deferred штука полезная, особенно в nodejs, когда есть много mysql запросов, которые не требуют вложенности, но скрипт не имеет права продолжить выполняться, пока все запросы не будут выполнены.
Для себя делал вот такой скрипт: github.com/lampaa/AsyncMarks
Штука получилась прикольная, берет Deferred своей простотой.
Deferred штука полезная, особенно в nodejs, когда есть много mysql запросов, которые не требуют вложенности, но скрипт не имеет права продолжить выполняться, пока все запросы не будут выполнены.
Для себя делал вот такой скрипт: github.com/lampaa/AsyncMarks
Штука получилась прикольная, берет Deferred своей простотой.
+5
Спасибо за ваше мнение. Да, знаю что JS разработчики часто не принимают CoffeeScript, но мне захотелось иллюстрировать происходящее именно на Coffee, поскольку именно его использую в повседневной практике. Вероятно, это было не популярное решение, но с моей точки зрения целесообразное.
+3
Нужно было бы (и стоит) сделать наоборот: показывать JS, а Coffee под спойлерами. Те, кому интересно (а это 99% аудитории) посмотрели бы, прельстились бы и попробовали бы. А сейчас он только всех раздражает и эффект получился противоположный. Вплоть до того, что я для своего применения сам обязательно так и сделаю, выкинув этот кофескрипт нахрен :)
Ну и, конечно, «генерируемый JS отдаёт нечеловечиной» — это гнилой отмаз. Отредактируйте его, сделайте человечнее.
Ну и, конечно, «генерируемый JS отдаёт нечеловечиной» — это гнилой отмаз. Отредактируйте его, сделайте человечнее.
0
Я вас услышал. Да, доля правды в ваших словах есть. Оспаривать не буду. Однако, я оформил статью так, как хотел бы прочитать ее я сам. Мне здесь нечего добавить. И отмазов никаких не было, выше я написал «В JS для большей наглядности некоторые вещи я бы оформил иначе». И я сделал бы это без каких-либо трудностей, если бы хотел. Но не хочу. Мне кажется все так, как должно быть. Мне жаль, что широкой публике это может быть не по нраву, но увы, у каждого из нас свое виденье.
+3
Ваша позиция понятна, вам нравится CoffeeScript. Но всё же, JavaScript знают и понимают все, а кофе — это просто сахар. Сегодня вы написали статью с использованием CoffeeScript, завтра Вася написал статью с использованием ClosureScript, послезавтра — с RedScript. Интересно будет?
+1
Уж не знаю, как вам, а мне было бы очень интересно.
+1
1) Мое мнение, что более чистый и лаконичный синтаксис КофеСкрипт идеально подходит для иллюстрирования идеи. Не загромождая код, можно показать самое важно. 2) Мне кажется, что затронутая тема может быть интересна не только JS разработчикам, а в таком случае «псевдокод» им будет читать еще и легче, чем нативный JS. 3) Если вы меня спрашиваете о том, приятно ли было бы мне читать JS в другом синтаксисе, то я вам отвечу следующее — да, мне было бы интересно прочитать примеры на, том же ClosureScript, если бы я видел во что они превратятся в итоге. Суть статьи все равно не в коде.
+1
1) Мое мнение, что более чистый и лаконичный синтаксис КофеСкрипт идеально подходит для иллюстрирования идеи.
Ну для тех кто пишет на Ruby, это возможно и так. По мне, так это насилие над программистом, а не псевдокод. Хоть я когда-то давно и брался за CoffeScript то сейчас вот просто взять и прочитать примеры не смог, лез под спойлер.
(кстати, бросил CoffeScript и перешел на TypeScript именно из-за того что он понятнее читается. Там меньше мусора, который любят выдавать за синтаксический сахар)
+2
Вы правы. Действительно, если бы я рассчитывал на широкую аудиторию то, использование кофескрипт было бы просчетом. Однако, я во-первых писал статью так, как хотел бы прочитать ее я сам. А во-вторых — целевая аудитория, которую я наметил — именно приверженцы руби. Тем не менее, я постарался дать и другим читателям возможность читать более привычный для них код. На этом предлагаю закрыть тему.
+2
По опыту могу сказать, что Deferred/Promise (особенно из jQuery) очень сложно отлаживать. Везде, где можно обойтись без Promise лучше написать код на чистом es.
Вот как я бы написал первые ваши примеры (там где можно обойтись без Promise):
Статья хорошая, но не хватает примеров с when, then, reject, fail и т.д. — ну чего-то более сложного про Deferred/Promise
Вот как я бы написал первые ваши примеры (там где можно обойтись без Promise):
window.log = () => console.log(...arguments);
for (var _i = 0; _i < 10; ++_i) {
let index = _i;
setTimeout(() => log(index), 1000);
}
Статья хорошая, но не хватает примеров с when, then, reject, fail и т.д. — ну чего-то более сложного про Deferred/Promise
+1
Спасибо, пригодится! Как раз недавно лепил костыль для подобного случая.
+2
По этой теме можно еще посмотреть github.com/willconant/flow-js
+1
Кстати, вместо
setTimeout
, в КофеСкрипте лучше смотрится его алиас after = (ms, fn) -> setTimeout(fn, ms)
:after 1000, ->
log index
dfd.resolve()
+1
Хорошее использование Deffered — ajaxQueue, плагин для жиквери, который создает очереди из ajax-запросов. Вот ответ на SO, в котором плагин и появился. Я его слегка модифицировал, добавив возможность вставлять запросы в самое начало очереди для очень важных данных.
+1
Столкнулся с проблемой реализации очереди запросов. Т.е. выполняется один запрос (не важно с ошибкой или без), запускается второй, затем третий и т.д. Причем запросов таких неизвестное количество. Пока запускаю deferred в рекурсии. Может быть есть способ лучше?
0
Привет из года 2015.
Пишу на CoffeeScript. Читать статьи с примерами на JavaScript становится всё ленивее, т.к. ну очень много синтаксического мусора, которого CoffeeScript лишён. Да и мозги уже думают компактнее.
За статью спасибо огромное. Тема весьма обширная и требует практики. Полгода использую promises для построения логики игрушек, и только сейчас обратил внимание на весьма важную фичу — пробрасывание исключений по цепочке, позволяющее прервать цепочку в любом месте — от которой вначале избавлялся распихивая .catch везде где возможно для скорейшего вывода ошибки в консоль.
За CoffeeScript отдельное спасибо.
Пишу на CoffeeScript. Читать статьи с примерами на JavaScript становится всё ленивее, т.к. ну очень много синтаксического мусора, которого CoffeeScript лишён. Да и мозги уже думают компактнее.
За статью спасибо огромное. Тема весьма обширная и требует практики. Полгода использую promises для построения логики игрушек, и только сейчас обратил внимание на весьма важную фичу — пробрасывание исключений по цепочке, позволяющее прервать цепочку в любом месте — от которой вначале избавлялся распихивая .catch везде где возможно для скорейшего вывода ошибки в консоль.
За CoffeeScript отдельное спасибо.
0
… А во-вторых — целевая аудитория, которую я наметил — именно приверженцы руби.
После лаконичного руби нативный JS кажется излишне многословным. К сожалению или к счастью, но это так.
Спасибо! Отличная статья.
+1
Sign up to leave a comment.
Ещё раз о Deferred/Promise