Pull to refresh

Comments 28

Лучше сразу на JS бы показывали. Зачем использовать два языка, при чём более популярный скрывать под спойлеры?
Логично. Но 1) В тексте мой исходник. Предпочел оставить его, поскольку генерируемый JS хоть и понятен, но стилистически «машинный». В JS для большей наглядности некоторые вещи я бы оформил иначе. 2) Пропаганда CoffeeScript :)
Не редко приходится встречать утверждение, что Deferred может использоваться не только вкупе с асинхронными функциями, но и с синхронными. На данный момент я не встречал задач, где это может пригодиться.

Это может пригодиться, если на данный момент вы работаете с синхронным API, но у вас есть подозрение (или желание), что через какое-то время придется перейти на асинхронное. Например, сейчас храните данные в localStorage, но есть желание попробовать IndexedDB.
Спасибо. Вы подтвердили мои предположения.
Именно по этому во всех promise библиотеках есть враппер функции, который проверяет вернула ли она promise или результат.

Пример:
a = ->
  123

b = ->
  dfd = new $.Deferred()
  dfd.resolve 123
  dfd.promise()

# работа с синхронной функцией
$.when(a).then ->
# аналогична работе с promise
$.when(b).then ->
Уж извините, статья полезная, но поставил 0, т.к. CoffeeScript режет глаза.

Deferred штука полезная, особенно в nodejs, когда есть много mysql запросов, которые не требуют вложенности, но скрипт не имеет права продолжить выполняться, пока все запросы не будут выполнены.

Для себя делал вот такой скрипт: github.com/lampaa/AsyncMarks

Штука получилась прикольная, берет Deferred своей простотой.
Спасибо за ваше мнение. Да, знаю что JS разработчики часто не принимают CoffeeScript, но мне захотелось иллюстрировать происходящее именно на Coffee, поскольку именно его использую в повседневной практике. Вероятно, это было не популярное решение, но с моей точки зрения целесообразное.
Нужно было бы (и стоит) сделать наоборот: показывать JS, а Coffee под спойлерами. Те, кому интересно (а это 99% аудитории) посмотрели бы, прельстились бы и попробовали бы. А сейчас он только всех раздражает и эффект получился противоположный. Вплоть до того, что я для своего применения сам обязательно так и сделаю, выкинув этот кофескрипт нахрен :)

Ну и, конечно, «генерируемый JS отдаёт нечеловечиной» — это гнилой отмаз. Отредактируйте его, сделайте человечнее.
Я вас услышал. Да, доля правды в ваших словах есть. Оспаривать не буду. Однако, я оформил статью так, как хотел бы прочитать ее я сам. Мне здесь нечего добавить. И отмазов никаких не было, выше я написал «В JS для большей наглядности некоторые вещи я бы оформил иначе». И я сделал бы это без каких-либо трудностей, если бы хотел. Но не хочу. Мне кажется все так, как должно быть. Мне жаль, что широкой публике это может быть не по нраву, но увы, у каждого из нас свое виденье.
Ваша позиция понятна, вам нравится CoffeeScript. Но всё же, JavaScript знают и понимают все, а кофе — это просто сахар. Сегодня вы написали статью с использованием CoffeeScript, завтра Вася написал статью с использованием ClosureScript, послезавтра — с RedScript. Интересно будет?
Уж не знаю, как вам, а мне было бы очень интересно.
1) Мое мнение, что более чистый и лаконичный синтаксис КофеСкрипт идеально подходит для иллюстрирования идеи. Не загромождая код, можно показать самое важно. 2) Мне кажется, что затронутая тема может быть интересна не только JS разработчикам, а в таком случае «псевдокод» им будет читать еще и легче, чем нативный JS. 3) Если вы меня спрашиваете о том, приятно ли было бы мне читать JS в другом синтаксисе, то я вам отвечу следующее — да, мне было бы интересно прочитать примеры на, том же ClosureScript, если бы я видел во что они превратятся в итоге. Суть статьи все равно не в коде.
1) Мое мнение, что более чистый и лаконичный синтаксис КофеСкрипт идеально подходит для иллюстрирования идеи.

Ну для тех кто пишет на Ruby, это возможно и так. По мне, так это насилие над программистом, а не псевдокод. Хоть я когда-то давно и брался за CoffeScript то сейчас вот просто взять и прочитать примеры не смог, лез под спойлер.
(кстати, бросил CoffeScript и перешел на TypeScript именно из-за того что он понятнее читается. Там меньше мусора, который любят выдавать за синтаксический сахар)

Вы правы. Действительно, если бы я рассчитывал на широкую аудиторию то, использование кофескрипт было бы просчетом. Однако, я во-первых писал статью так, как хотел бы прочитать ее я сам. А во-вторых — целевая аудитория, которую я наметил — именно приверженцы руби. Тем не менее, я постарался дать и другим читателям возможность читать более привычный для них код. На этом предлагаю закрыть тему.
По опыту могу сказать, что Deferred/Promise (особенно из jQuery) очень сложно отлаживать. Везде, где можно обойтись без Promise лучше написать код на чистом es.
Вот как я бы написал первые ваши примеры (там где можно обойтись без 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
И, кстати да, в CoffeeScript тоже есть спреды
window.log = -> try console.log arguments...
Вам под спойлер «Еще немного сахара в Coffee». Эту штуку я оставил там как опциональную. Спасибо за замечание )
Чисто теоретически, это излечимая проблема. В WinRT была аналогичная проблема с отладкой асинхронных тасков (в т.ч. в приложениях на JS), и ее решили в VS 2013. Нет причин, по которым нельзя сделать то же самое для ноды.
Спасибо, пригодится! Как раз недавно лепил костыль для подобного случая.
Кстати, вместо setTimeout, в КофеСкрипте лучше смотрится его алиас after = (ms, fn) -> setTimeout(fn, ms):

after 1000, ->
  log index
  dfd.resolve()
Хорошее использование Deffered — ajaxQueue, плагин для жиквери, который создает очереди из ajax-запросов. Вот ответ на SO, в котором плагин и появился. Я его слегка модифицировал, добавив возможность вставлять запросы в самое начало очереди для очень важных данных.
Столкнулся с проблемой реализации очереди запросов. Т.е. выполняется один запрос (не важно с ошибкой или без), запускается второй, затем третий и т.д. Причем запросов таких неизвестное количество. Пока запускаю deferred в рекурсии. Может быть есть способ лучше?
Привет из года 2015.
Пишу на CoffeeScript. Читать статьи с примерами на JavaScript становится всё ленивее, т.к. ну очень много синтаксического мусора, которого CoffeeScript лишён. Да и мозги уже думают компактнее.

За статью спасибо огромное. Тема весьма обширная и требует практики. Полгода использую promises для построения логики игрушек, и только сейчас обратил внимание на весьма важную фичу — пробрасывание исключений по цепочке, позволяющее прервать цепочку в любом месте — от которой вначале избавлялся распихивая .catch везде где возможно для скорейшего вывода ошибки в консоль.

За CoffeeScript отдельное спасибо.
рад что пригодилось
… А во-вторых — целевая аудитория, которую я наметил — именно приверженцы руби.

После лаконичного руби нативный JS кажется излишне многословным. К сожалению или к счастью, но это так.
Спасибо! Отличная статья.
Sign up to leave a comment.

Articles