Koa/Co/Bluebird или Q/Generators/Promises/Тонки взаимодействуют? (Node.js)

Я изучаю создание веб-приложения частично с Koa, но у меня не совсем есть ручка на hows, whens и whys выбора между - и применением - диапазон поддерживающих "асинхронных" технологий/подходы (перечислены ниже).

В целом разрозненные рекомендации в Интернете по этому вопросу все еще оставляют все расплывчатым, особенно в отношении эволюционирующих передовых методов или, по крайней мере, лучших, и при каких сценариях. В Интернете, кажется, мало или ничего нет, что ставит все это в контекст.

Я надеюсь, что ответы на этот большой растянутый пост могут исправить это. Кроме того, возможно, приведенные ниже вопросы могут вдохновить кого-то написать подробное сообщение в блоге или подобное, чтобы решить этот вопрос. Я имею в виду, что я даже не близок к единственному, кто выиграет от этого.

Поэтому я был бы рад, если бы яркое сообщество могло ответить на вопросы и дать ясность следующим вопросам в отношении технологий, перечисленных ниже (жирным шрифтом):

- a) Как и при каких обстоятельствах (если применимо) они дополняют, дополняют, заменяют и/или перекрывают друг друга решения?

- b) Каковы их компромиссы в отношении быстродействия, легкость обработки ошибок и легкость отладки?

- c) Когда, где и почему может быть лучше использовать технологию "this" против "той", технологии - комбо и/или подход?

- d) Какие технологии или подходы, если таковые имеются, могут быть "тусклыми звездами".

(Надеясь, что мнения, которые являются частью ответов, могут быть хорошо объяснены.)

==============================

Технологии:

* Koa *

Мое понимание:

Koa - это минимальная основа для создания приложений Node, предназначенных для использования функций ECMAScript-6, одна из которых, в частности, является генераторами.

* Co *

Мое понимание:

- Co - это библиотека утилиты для запуска генераторов ECMAScript-6 (которые являются родными для гармонии Node.011), цель которой состоит в том, чтобы выделить/много (?) необходимости писать шаблонный код для запуска и управления генераторами.

- Со является неотъемлемой частью Коа (?).

Конкретные вопросы:

- Если и как использовать Co по-разному в Koa, чем в контексте, отличном от Koa. Другими словами, делает ли Коа полностью фасадом Co?

- Может ли Co быть заменена в Koa какой-либо другой подобной генераторной библиотекой, если она/была лучшей? Есть ли?

* Библиотеки Promise, такие как "Q" и Bluebird *

Мое понимание:

- Они в некотором смысле "полиполны" для внедрения спецификации Promises/A +, если и до Node изначально выполняется эта спецификация.
- У них есть некоторые дополнительные утилиты для удобства использования, которые облегчают использование promises, например, утилиты Bluebird promisfyAll.

Конкретные вопросы:

- Я понимаю, что спецификация ECMAScript-6 действительно будет/будет в значительной степени отражать спецификацию Promises/A +, но даже при этом Node 0.11v гармония не реализует Promises. (Правильно ли это?) Однако когда это произойдет, появятся ли технологии, такие как Q и ​​Bluebird?

- Я читал кое-что о том, что генераторы поддержки "Q" и Bluebird. Что это значит? Означает ли это отчасти то, что, например, они в какой-то степени обеспечивали такую ​​же полезность, как и Co, и если да, то в какой степени?

* Thunks и Promises *

Я думаю, что у меня есть справедливая ручка на том, что они есть, но надеясь, что кто-то может предоставить краткое и ясное определение "высоты лифта" в отношении того, что каждый из них, и, конечно, как указано выше, объясняет, когда следует использовать один против другое - в контексте Коа, а не в нем.

Конкретные вопросы:

- Pro и против использования чего-то вроде Bluebird, по сравнению с использованием Thunkify (github com/visionmedia/ node -thunkify)?

==============================

Чтобы дать некоторый дополнительный контекст этому сообщению и его вопросам, может быть интересно, если бы методы Коа, представленные на следующих веб-страницах, могли обсуждаться и контрастироваться (особенно на основе плюсов и минусов):

- a) www.marcusoft. net/2014/03/koaintro.html(Где трюки или promises, или я ничего не вижу?)

- b) strongloop. com/strongblog/ node -js-express-введение-koa-js-zone (Опять же, где thunks или promises?)

- c) github. com/koajs/koa/blob/master/docs/guide.md(Что означает "следующий" аргумент, и что его установить и где?)

- d) blog.peterdecroos. com/blog/2014/01/22/javascript-generators-first-impressions (Не в контексте Koa, но представляет собой использование Co с библиотекой обещаний (Bluebird), поэтому я предполагаю, что представленная здесь техника/образец дает к использованию в Коа (?). Если да, то насколько хорошо?

Спасибо всем!

Ответ 1

Я работаю почти с генераторами в течение месяца, так что, возможно, я могу нанести удар. Я постараюсь свести мнения к минимуму. Надеюсь, это поможет прояснить некоторые путаницы.

Отчасти из-за отсутствия лучших практик и более подробных объяснений это то, что эта функция все еще настолько новая в javascript. Есть еще очень мало мест, где вы можете использовать генераторы node.js и firefox, являющиеся наиболее заметными, хотя firefox немного отличается от стандартного.

Я хотел бы отметить, что есть такие инструменты, как traceur и регенератор, которые позволят вам использовать их для разработки и позволят вам превратить их в полуэквивалентные ES5, поэтому, если вы обнаружите, что работа с ними приятна, тогда нет причин не начинать используя их, если вы не нацеливаете архаичные браузеры.

Генераторы

Генераторы первоначально не воспринимались как способ обработки асинхронных потоков управления, но они прекрасно работают над ним. Генераторы - это, по сути, функции итератора, которые позволяют их выполнение приостанавливаться и возобновляться с использованием урожая.

Ключевое слово yield по сути говорит, что возвращает это значение для этой итерации, и я заберу, где я остановился, когда вы снова вызовите next().

Функции генератора - это специальные функции, поскольку они не выполняют первый раз, когда они вызывают, но вместо этого возвращают объект итератора с несколькими методами на нем и возможность использования в циклах for-of и array.

send(),: Это отправляет значение в генератор, обрабатывая его как последнее значение доходности и продолжает следующую итерацию

next(),: Это продолжит следующую итерацию генератора

throw(): Это генерирует исключение INTO генератора, вызывающего генератор, который генерирует исключение, как если бы оно было получено из последнего оператора yield.

close(): это заставляет генератор возвращать выполнение и вызывает любой окончательный код генератора, который позволяет при необходимости запускать окончательную обработку ошибок.

Их способность приостанавливаться и возобновляться - вот что делает их настолько мощными при управлении потоком.

Co

Co была основана на способности генераторов облегчить управление потоком обработки. Он не поддерживает все то, что вы можете делать с генераторами, но вы можете использовать большинство из них с помощью использования с меньшим количеством шаблонов и головной боли. И для целей управления потоком я не обнаружил, что мне нужно что-либо за пределами того, что предоставляет. Хотя, честно говоря, я не пробовал отправлять значение в генератор во время контроля потока, но это вызывает некоторые интересные возможности....

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

Что касается node и лучших практик, я бы сказал, что co в настоящее время выигрывает руки с количеством инструментов поддержки, которые были созданы для этого. С приостановкой, скорее всего, занявший второе место.

Co работает как с promises, так и с thunks, и они используются для оператора yield, так что co знает, когда продолжать выполнение генератора вместо того, чтобы вы вручную вызывали next(). Co также поддерживает использование генераторов, функций генератора, объектов и массивов для дальнейшей поддержки управления потоком.

Получив массив или объект, вы можете выполнить параллельные операции над всеми получаемыми элементами. Уступив генератору или функции генератора, co будет делегировать дальнейшие вызовы новому генератору до тех пор, пока он не будет завершен, а затем возобновит вызов следующего по текущему генератору, что позволит эффективно создавать очень интересные механизмы управления потоком с минимальным шаблоном кода.

Promises

В то время как я сказал, что буду придерживаться мнения до минимума, я хотел бы сказать, что для меня promises, вероятно, самая сложная концепция. Они являются мощным инструментом для поддержания кода, но им трудно понять внутреннюю работу и могут приходить с довольно большим количеством ошибок при использовании для расширенного управления потоком.

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

Обе библиотеки обещаний никуда не собираются в ближайшее время. Они добавляют много приятных для haves для promises включенных done(), которые не попадают в спецификацию ES6. Не говоря уже о том, что одни и те же библиотеки можно использовать в браузере, а в node мы будем использовать их в течение долгого времени.

санки

Thunks - это просто функции, которые принимают один обратный вызов параметров и возвращают другую функцию, которую они обертывают.

Это создает замыкание, которое позволяет вызывающему коду создавать экземпляр функции, передаваемой в своем обратном вызове, чтобы можно было сказать, когда этот метод завершен.

Thunks довольно прямолинейны, чтобы понять и использовать, по моему мнению, но они не являются правильным инструментом для всего. Например, spawn является основной болью для создания thunk, вы можете это сделать, но это нелегко.

Thunks vs. Promises

Они не являются взаимоисключающими и могут быть легко использованы вместе, но обычно лучше для вашего здравомыслия выбрать один и придерживаться его. Или, по крайней мере, выберите соглашение, чтобы вы могли легко сказать, что есть. Thunks работает быстрее из моего опыта, но я не сравнивал его. Большая часть этого, вероятно, связана с меньшей абстракцией и не имеет встроенных механизмов обработки ошибок.

Как правило, вы создаете что-то, что требует обработки ошибок, поэтому общая прибыль от выигрыша может легко или просто оказаться в стороне от promises в зависимости от вашего кода.

Когда использовать

Генераторы. Если вы можете с уверенностью сказать, что ваше приложение сможет работать на краю кровотечения, будь то firefox только для браузера или node > 0.11.3

Я использую их широко в компании, в которой я сейчас выхожу, и не мог быть более счастливым с механизмами потока управления и ленивой оценкой, которую они позволяют.

Promises против Thunks - это действительно зависит от вас и насколько вы комфортно работаете с каждым. Они не дают одинаковых преимуществ и не решают одну и ту же проблему. promises Помогите справиться с проблемой async напрямую, thunks просто убедитесь, что функция принимает требуемый параметр обратного вызова для другого кода, который должен пройти.

Вы можете использовать их обе вместе и до тех пор, пока вы можете сохранить их так, чтобы было очевидно, что у вас не будет проблем.

Promises/Thunks with Generators - я предлагаю сделать это в любое время, когда вы используете генераторы для потока управления. Это не обязательно, но проще, просто использовать co как абстракцию для управления потоком с генераторами. Меньше кода для ввода, упрощения обслуживания и меньших возможностей, которые вы попадете в крайний кейс, который еще кто-то еще не запустил.

Коа

Я не собираюсь подробно рассказывать о koa. Достаточно сказать, что это похоже на выражение, но написанное, чтобы воспользоваться генераторами. Это дает некоторые уникальные преимущества, такие как упрощение обработки ошибок и каскадное промежуточное программное обеспечение. Раньше были способы выполнить все эти задачи, но они были не изящными, а иногда и не самыми результативными.

Специальное примечание: Генераторы открывают дверь возможностей, которые мы еще не изучили. Точно так же, как они могут использоваться для управления потоком, когда это не был их первоначальный дизайн, я уверен, что они могут быть использованы для решения многих других проблем, с которыми у нас обычно возникают проблемы с javascript. Вероятно, это будут более яркие умы, чем я, которые узнают, как еще мы можем их использовать, но я, по крайней мере, начал бы играть с ними и лучше понимать, на что они способны. Еще больше преимуществ для генераторов, входящих в ES.next.