Для чего нужны пайпы
Основы реактивного программирования с использованием RxJS. Часть 2. Операторы и пайпы
В предыдущей статье мы рассмотрели, что такое потоки и с чем их едят. В новой части мы познакомимся с тем, какие методы RxJS предоставляет для создания потоков, что такое операторы, пайпы(pipes) и как с ними работать.
Серия статей «Основы реактивного программирования с использованием RxJS»:
RxJS обладает богатейшим API. В документации описано более ста методов. Чтобы немного познакомиться с ними, мы напишем простое приложение и на практике посмотрим, как выглядит реактивный код. Вы увидите, что одни и те же задачи, которые раньше казались рутинными и требовали написания большого количества кода, имеют элегантное решение, если смотреть на них сквозь призму реактивности. Но прежде чем мы перейдем к практике, рассмотрим, как потоки можно представить графически, и познакомимся с удобными методами для их создания и обработки.
Графическое представление потоков
Чтобы наглядно продемонстрировать, как ведет себя тот или иной поток, я буду использовать принятую в реактивном подходе нотацию. Вспомним наш пример из предыдущей статьи:
Вот как будет выглядеть его графическое представление:
Поток обычно изображается в виде прямой линии. Если поток испускает какое-либо значение, то оно отображается на линии в виде кружка. Прямая черта в отображении — это сигнал завершения потока. Для отображения ошибки используется символ — “×”.
Потоки в одну строчку
В моей практике я редко сталкивался с необходимостью создавать свои экземпляры Observable напрямую. Большинство методов для создания потоков уже есть в RxJS. Чтобы создать поток, испускающий значения 1 и 2, достаточно лишь использовать метод of:
Метод of принимает на вход любое количество аргументов и возвращает готовый экземпляр Observable. После подписки он испустит полученные значения и завершится:
Если вы хотите представить массив в виде потока, то можно воспользоваться методом from. Метод from в качестве аргумента ожидает любой итерируемый объект(массив, строка и т.д.) или promise, и проецирует этот объект на поток. Вот как будет выглядеть поток, полученный из строки:
А вот так можно обернуть promise в поток:
Примечание: часто потоки сравнивают с promise. На самом деле, они имеют всего одну общую черту — push стратегию распространения изменений. В остальном это абсолютно разные сущности. Promise не может выдать несколько значений. Он может только выполнить resolve или reject, т.е. иметь только два состояния. Поток же может передавать несколько значений, и может быть повторно использован.
А помните пример с интервалом из первой статьи? Данный поток представляет собой таймер, который отсчитывает время в секундах с момента подписки.
Вот как в одну строчку можно реализовать то же самое:
И напоследок метод, который позволяет создать поток событий DOM элементов:
В качестве значений этот поток будет получать и испускать объекты события “keyup”.
Пайпы & операторы
Pipe — это метод класса Observable, добавленный в RxJS в версии 5.5. Благодаря ему мы можем строить цепочки операторов для последовательной обработки значений, полученных в потоке. Pipe представляет собой однонаправленный канал, который связывает между собой операторы. Сами операторы являются обычными функциями, описанными в RxJS, которые обрабатывают значения из потока.
Например, они могут преобразовать значение и передать его дальше в поток, или могут выполнять роль фильтров и не пропускать какие-либо значения, если они не соответствуют заданному условию.
Посмотрим на операторы в деле. Умножим каждое значение из потока на 2 с помощью оператора map:
Вот как выглядит поток до применения оператора map:
После оператора map:
Давайте воспользуемся оператором filter. Этот оператор работает точно так же, как функция filter в классе Array. Первым аргументом метод принимает функцию, в которой описано какое-либо условие. Если значение из потока удовлетворяет условию, то оно пропускается дальше:
И вот как будет выглядеть вся схема нашего потока:
Пишем приложение
Теперь, когда мы выяснили, что такое пайпы и операторы, можно приступать к практике. Наше приложение будет выполнять одну простую задачу: выводить список открытых репозиториев github по введенному никнейму владельца.
Требований будет немного:
Начнем с html разметки. Опишем input и ul элементы:
Затем в js или ts файле получим ссылки на текущие элементы используя browser API:
Ещё нам понадобится метод, который будет выполнять запрос к github API. Ниже приведен код функции getUsersRepsFromAPI, которая принимает на вход никнейм пользователя и выполняет ajax запрос, используя fetch. Затем возвращает promise, попутно преобразуя успешный ответ в json:
Следом напишем метод, который будет выводить список названий репозиториев:
Приготовления завершены. Настало время посмотреть на RxJS в действии. Нам необходимо слушать событие keyup нашего input’а. Первым делом мы должны понять, что в реактивном подходе мы работаем с потоками. К счастью, в RxJS уже предусмотрен подобный вариант. Вспомните метод fromEvent, который я упоминал выше. Используем его:
Теперь наше событие представлено как поток. Если мы посмотрим, что выводится в консоль, то увидим объект типа KeyboardEvent. Но нам нужно введенное пользователем значение. Вот тут-то нам и пригодится метод pipe и оператор map:
Перейдем к реализации требований. Начнем с того, что будем выполнять запрос, когда введенное значение содержит более двух символов. Для этого воспользуемся оператором filter:
С первым требованием разобрались. Приступим ко второму. Нам необходимо реализовать debounce. В RxJS есть оператор debounceTime. Данный оператор в качестве первого аргумента принимает число миллисекунд, в течение которых значение будет удерживаться, прежде чем пройдет дальше. При этом каждое новое значение будет сбрасывать таймер. Таким образом, на выходе мы получим последнее значение, после ввода которого прошло 700 миллисекунд.
Вот как может выглядеть наш поток без debounceTime:
А вот так будет выглядеть тот же поток, пропущенный через этот оператор:
С debounceTime мы будем реже обращаться к API, за счет чего получим экономию трафика и разгрузим сервер.
В целях дополнительной оптимизации предлагаю использовать еще один оператор — distinctUntilChanged. Данный метод избавит нас от дубликатов. Лучше всего показать его работу на примере:
Добавим данный оператор сразу после оператора debounceTime. Таким образом, мы не будем обращаться к API, если новое значение по какой-то причине совпадает с предыдущим. Подобная ситуация может возникнуть, когда пользователь ввел новые символы, а затем снова стер их. Так как у нас реализована задержка, в поток попадет только последнее значение, ответ на которое у нас уже есть.
Идем на сервер
Уже сейчас мы можем описать логику запроса и обработки ответа. Пока мы умеем только работать с promise. Поэтому опишем еще один оператор map, который будет вызывать метод getUsersRepsFromAPI. В наблюдателе опишем логику обработки нашего promise:
На текущий момент мы реализовали все, что хотели. Но у нашего примера есть один большой недостаток: нет обработки ошибок. Наш наблюдатель получает только promise и понятия не имеет, что что-то могло пойти не так.
Конечно, мы можем навесить catch на promise в методе next, но из-за этого наш код начнет все больше напоминать “callback hell”. Если вдруг нам понадобится выполнить еще один запрос, то сложность кода возрастет.
Примечание: использование promise в коде с RxJS считается антипаттерном. Promise имеет множество недостатков по сравнению с observable. Его нельзя отменить, и нельзя использовать повторно. Если перед вами стоит выбор, то выбирайте observable. То же самое касается метода toPromise класса Observable. Данный метод был реализован в целях совместимости с библиотеками, которые не могут работать с потоками.
Мы можем использовать метод from, чтобы спроецировать promise на поток, но этот способ чреват дополнительными вызовами метода subscribe, и также приведет к разрастанию и усложнению кода.
Решить эту проблему можно с помощью оператора mergeMap:
Теперь нам не нужно писать логику обработки promise. Метод from сделал из promise поток, а оператор mergeMap обработал его. Если promise выполнится успешно, то вызовется метод next, и наш наблюдатель получит готовый объект. Если же произойдет ошибка, то будет вызван метод error, и наш наблюдатель выведет ошибку в console.
Оператор mergeMap немного отличается от тех операторов, с которыми мы работали ранее, он принадлежит к так называемым Higher Order Observables, о которых я расскажу в следующей статье. Но, забегая вперед, скажу, что метод mergeMap сам подписывается на поток.
Обработка ошибок
Если наш поток получит ошибку, то он завершится. И если попытаться после ошибки взаимодействовать с приложением, то никакой реакции мы не получим, так как наш поток завершился.
Тут нам поможет оператор catchError. catchError вызывается только тогда, когда в потоке появляется ошибка. Он позволяет перехватить ее, обработать и вернуть в поток обычное значение, которое не приведет к его завершению.
Мы перехватываем ошибку в catchError и вместо нее возвращаем поток с пустым массивом. Теперь при возникновении ошибки мы очистим список репозиториев. Но затем поток снова завершится.
Все дело в том, что catchError подменяет наш оригинальный поток на новый. И дальше наш наблюдатель слушает только его. Когда поток of испустит пустой массив, будет вызван метод complete.
Чтобы не подменять наш оригинальный поток, вызовем оператор catchError на потоке from внутри оператора mergeMap.
Таким образом, наш оригинальный поток ничего не заметит. Вместо ошибки он получит пустой массив.
Заключение
Мы наконец-то перешли к практике и увидели, для чего нужны пайпы и операторы. Рассмотрели, как можно сократить код, пользуясь богатым API, которое предоставляет нам RxJS. Конечно, наше приложение не закончено, в следующей части мы разберем, как можно в одном потоке обрабатывать другой и как отменять наш http запрос, чтобы еще больше экономить трафик и ресурсы нашего приложения. А чтобы вы могли увидеть разницу, я выложил пример без использования RxJS, посмотреть его можно здесь. По этой ссылке вы найдете полный код текущего приложения. Для генерации схем я пользовался RxJS визуализатором.
Надеюсь, что данная статья помогла вам лучше понять, как устроен RxJS. Желаю вам успехов в изучении!
Пайп это в автомобиле
Даунпайп (downpipe) переводится с английского языка как «водосточная труба». Используется в автомобильном тюнинге при установке турбины или замене старой на более мощный и производительный аналог. Часть системы выхлопных газов двигателя. Изготовляется из прочных и жароустойчивых материалов (чаще из нержавеющей стали) на заказ, в зависимости от мотора, модели турбины, конструкционных особенностей выхлопной системы и др.
Конструкция и назначение
Даунпайп состоит из следующих частей:
О назначении
Видео: Что такое даунпайп? Просто о сложном
Установка даунпайпа
Монтаж даунпайпа проводится в следующей последовательности:
Есть ли смысл устанавливать даунпайп?
Сам по себе даунпайп не даёт улучшения ( прироста мощности, спортивного выхлопного звука и т.д.) Но он является важным элементом при проведении комплексных мероприятий по модернизации силового агрегата и выхлопной системы.
В некоторых случаях даунпайп незаменим: при превращении «атмосферника» в «злой» турбированный двигатель или монтаже новой высокопроизводительной турбины. При таком тюнинге нельзя оставлять заводскую выхлопную систему, так как она не сможет эффективно решать поставленные задачи.
Возможные трудности при монтаже
Основные проблемы при установке даунпайпа связаны с откручиванием крепёжных элементов (гаек) с горячей части турбины. Автомобильная система выхлопа работает в тяжёлых условиях. Подвержена воздействию высоких температурных нагрузок, сталкивается с водой и агрессивными веществами (реагентами на дорогах). Неблагоприятные эксплуатационные условия ускоряют коррозионные процессы.
Поэтому перед монтажом даунпайпа будет не лишним запастись следующими крепежами:
Самостоятельный тюнинг выхлопной системы и автомобиля в целом проводится при наличии знаний и определённых умений. В противном случае потратите большое количество времени и денежных средств впустую, но не добьётесь желаемого результата. Поэтому беритесь за самостоятельное изготовление и установку даунпайпа только тогда, когда уверены в своих силах. В остальных случаях лучше обращаться в специальные тюнинг-салоны и техцентры.
За неимением собственной терминологии в области тюнинга, мы в России оперируем англоязычными понятиями ну и нашими исковерканными аналогами. При этом для многих значение этих слов остаются непонятными, а некоторые и вовсе используются неправильно. Давайте разбираться.
Pipe или «пайп» переводится на русский язык как «труба». Под словом «пайпинг» при этом понимается трубопровод или система из труб. Собственно выпускная система любого автомобиля состоит в первую очередь из труб и каждый отрезок этих труб имеет свое название. И если некоторые из них, вроде «даунпайпа» плотно вошли в обиход российских тюнеров, то все остальные никто не использует. А еще хуже когда используют колхозные понятия, вроде «трасса»…
Итак, сразу после головки цилиндров у нас находится первое изделие из труб — «exhaust manifold», он же «header», он же «collector», он же русский «выпускной коллектор». Как в русском так и в английском языке в случае турбомотора коллектор тоже имеет приставку «турбо».
Раннеры от слова «runner» — это трубы, которые идут от каждого цилиндра к тому месту, где они объединяются вместе. Если раннеры одинаковой длины — коллектор называют «равнодлинным».
Merge collector — место объединения труб.
Важным частным случаем коллектора являются кат-коллекторы или «manifold converter» — 90% современных автомобилей имеют коллекторы, в которые сразу интегрирован каталитический нейтрализатор. У них короткие раннеры, часто примитивный дизайн из штампованной стали а замена катализатора возможна только в сборе. Такая деталь при этом совсем не дешева и часто весьма «затычна» с точки зрения продувки, не столько из-за катализатора, сколько из-за не оптимального сечения и длины раннеров.
Названия труб после коллектора будут отличаться, в зависимости от того атмосферный мотор или турбированный.
В тубо-моторе сразу от турбины начинается всеми любимый «downpipe» (даунпайп) дословно «труба идущая вниз», прямого аналога в русском нет, но «приемная труба» вполне подходит.
«Flex pipe» — в России прижилось название «гофра», по человечески называется «‘эластичное соединение». На задне-приводных авто даунпайп может быть и без эластичного элемента.
Еще одна труба со своим предназначением и названием — dump pipe или dump tube — трубка отвода газов от Вестгейта (перепускного клапана турбины). Присутствует в тех случаях когда вестгейт внешний или имеет на фланце турбины свой собственный отдельный выход. Если Вестгейт встроенный и не имеет своего отвода, то газы идут сразу в даунпайп и отдельной трубы не требуется.
В случае атмосферного мотора сразу за коллекторами следуют «front pipes» (фронт пайпы) или по-русски приемные трубы. В приемных трубах обычно установлен один или несколько каталитических нейтрализаторов.
Заменой фронт пайпам часто становятся cat delete pipes — приемные трубы без катализаторов, в которых один или несколько катализаторов удалены а на их месте прямая труба.
Прошу заметить, что никаких «пламегасителей» и «стронгеров» при этом ни в даунпайпах ни в фронт пайпах нет и не бывает. Вы не найдете их аналогов в английском языке и не найдете этих изделий в ассортименте зарубежных компаний.
После приемных труб (даунпайпа в турбо моторе или фронт пайпа в автомсферном моторе) начинается «middle section» — средняя часть выхлопа. Она обычно включает в себя первичный глушитель и части труб, идущие до заднего моста.
В атмосферных моторах с двутрубным выхлопом на стыке приемных труб и средней части появляются новые герои — всеми любимые H-pipe или X-pipe или их сочетания. В зависимости от конструкции и компоновки Х-pipe или H-pipe могут быть объединены с приемными трубами или быть отдельным элементом в средней части системы. Они могут быть как до так и после резонаторов, а то и вовсе интегрированы в сам резонатор или первичный глушитель.
Downpipe (даунпайп) – с английского дословно переводится, как водосточная труба. Это один из элементов системы вывода выхлопных газов. Зачастую его используют для индивидуального и неофициального тюнинга, чтобы соединить турбину с выхлопной системой автомобиля. При тюнинге мотора необходимо увеличенное поступление воздуха в цилиндры и соответственно увеличится отток выхлопных газов. Стоковый глушитель не всегда готов справится с этими нагрузками, поэтому и приходится менять его на трубу определенных размеров и форм. Если не сделать этого, то смысл в установке турбины пропадает, ведь двигатель начнет «захлебываться» на повышенных передачах.
Даунпап – это в прямом смысле труба, служащая для перемещения газов от двигателя к турбине. Она ставится больше в диаметре нежели стоковая, при этом полностью убирается катализатор, а также в некоторых случаях убирают и средний резонатор. Труба изготавливается из особо жаростойких металлов, ведь перемещающиеся по ней газы могут достигать 400 градусов. В конечной точке вместо глушителя обычно устанавливают прямоток, что придает двигателю приятное звучание на высоких оборотах. Но имейте ввиду, что внесение подобных изменений в конструкцию транспортного средства не всегда получается объяснить в ГИБДД при регистрации автомобиля. Поэтому обычный выхлоп меняют на прямоток уже после получения документов на новый двигатель. Для минимизации вибраций на кузов автомобиля обязательно присутствие гофры — это еще одна особенность строения даунпайпа. Не пренебрегайте ей, так езда на таком автомобиле будет комфортной, а лакокрасочное покрытие не будет отслаиваться преждевременно.
Для чего вообще нужен даунпайп?
При установке турбины, непредусмотренной конструкцией автомобиля, приходится думать, как же своеобразно устроить подводку к ней отработанных газов. Штатный глушитель от необходимого автопроизводителя, вы скорее всего не найдете, АвтоВАЗ такие вообще не выпускает. Выходом как раз и будет являться установка специальной отводной трубы, именуемой даунпайп. Но стоит отметить, что для некоторых моделей американских, японских или европейских автомобилей все же возможно купить новый подвод от двигателя в специализированных магазинах автозапчастей.
Как и из чего изготовить даунпайп?
Как уже упоминалось ранее, такие трубы делают из жаростойких и особо прочных материалов, а значит стоят они недешево. В основном применяется жаростойкая сталь или ее сплавы, которые изготавливаются вручную под конкретный автомобиль. Для этого снимают мерки автомобиля и двигателя, хотя в крупных специализированных компаниях уже имеются все измерения, что существенно экономит время.
Установка даунпайпа.
Алгоритм здесь достаточно точный:
1. Производим демонтаж стокового коллектора.
2. Меняем его на более производительный, типа «паук».
3. Ставим новую турбину, настраиваем ее, не забывая про перепрограммирование электронного блока управления.
4. Соединяем турбину и новый коллектор даунпайпом.
Преимущества.
И в конце хотелось бы сказать о преимуществах, которые можно увидеть невооружённым взглядом даже новичку:
— повышение мощности автомобиля до 40%;
— уменьшение расхода топлива;
— увеличение срока службы выхлопной системы.
Можно сделать вывод, что не стоит пренебрегать модификацией выхлопной системы при установке турбины на двигатель автомобиля. А во избежание ошибок, которые в худшем случае могут привести к повреждению двигателя, обращайтесь в профессиональные тюнинговые ателье или проверенные СТО.
Что такое даунпайп в автомобиле
Для многих молодых уличных гонщиков прокачать свой автомобиль является делом чести. Даунпайп используется при проведении тюнинга турбины или ее замене на модель помощнее. Расскажем о том, что такое даунпайп в автомобиле.
Что такое даунпайп в авто и где он расположен
В переводе с английского “даун пайп” означает “водосточная труба”. Предназначение детали в авто – отведение от двигателя выхлопных газов. Даунпайп устанавливается сразу за турбиной, правее двигателя. Он выводит газы в выхлопную систему. Даунпайн изготавливается из прочных, устойчивых к высоким температурам, металлов. Делается под заказ и зависит от модели автомобиля, конструкции его выхлопной системы, особенностей двигателя и указанных владельцем параметров.
Функционал устройства
Так для чего нужен даунпайп и какие функции он выполняет? Так как это труба, изготовленная из высокопрочной, нержавеющей стали (в большинстве вариантов), предназначенная для отвода выхлопных газов, она должна выдерживать высокие температуры. Повышенные жароустойчивые свойства – это главное требование к качеству устройства. Обычно его делают из нержавеющей стали сварным способом.
Чтобы добиться прочности сварных швов, используется аргонно-дуговая сварка.
В конструкцию входит многослойная гофра. Она снижает вибрации и колебания, которые передаются на кузов. Даунпайп крепится к системе фланцевым методом. Фланцы обеспечивают надежное и прочное соединение устройства с другими составляющими системы. Для этого крепежи дополнительно обрабатываются с точностью до миллиметра.
В функционал даунпайпа входят:
соединение двигателя и турбины с системой отвода выхлопных газов;
отвод выхлопных газов из двигателя и турбины с меньшим сопротивлением;
возможность увеличения мощности при чип-тюнинге.
Даунпайп устанавливается после демонтажа заводского выпускного коллектора. Даунпайп является деталью большей производительности для улучшения функционирования выхлопной системы в целом. С его помощью можно увеличить аэродинамические качества автомобиля. Даунпайп становится ключевым элементом для проведения модернизации выхлопной системы авто.
Устройство будет незаменимой комплектующей при установке новой, более мощной турбины или превращения обычного автомобиля в турбинный гоночный болид. Такой тюнинг призван напрочь сносить заводскую выхлопную систему и устанавливать детали, способные выдержать высокотемпературную нагрузку. По сути, даунпайп – это большая труба, в которой ничто не задерживает потоки отработанных газов.
Виды даунпайпа
Даунпайпы бывают без катализатора и со спортивным катализатором. Обе модели обладают одинаковой производительностью и эффективностью. Разница заключается в наличии фильтра (катализатора), очищающего выхлопные газы до нормативов Евро 4-5. Это дает владельцу авто относительное спокойствие по поводу загрязнения окружающей среды, однако не более того. Даунпайп со спорт катализатором стоит немного дороже. По свойствам он аналогичен с даунпайном без катализатора. Он также имеет высокую пропускную способность и повышенную производительность.
Существует разновидность даунпайпа, которая устанавливается на атмосферный двигатель (без турбины). Автомастерские изготавливают или приобретают для тюнинга два вида устройств. Аппайп устанавливается только на турбинные двигатели, а даунпайп может быть установлен и на атмосферные. В этом случае сохраняется весь функционал устройства, зато решаются проблемы с фильтрацией выхлопных газов и быстрым их отводом.
Плюсы и минусы использования устройства
большая пропускная способность;
большой диаметр трубы;
высокая эффективность, доказанная на практике;
возможность уменьшения эффекта «турбо-ямы» или «турбо-провала».
Если установить даунпайп с катализатором, то можно решить проблему очистки выхлопных газов до стандартов Евро 4-5. Это позволит беспрепятственно путешествовать по странам Евросоюза, не опасаясь быть оштрафованным за загрязнение окружающей среды и несоблюдение общеевропейских норм безопасности.
Как у любого устройства, у даунпайпа есть свой минус. Это достаточно высокая цена детали, несмотря на то, что ее качество полностью соответствует современным параметрам. Также возможны трудности при монтаже устройства. Несмотря на точную подгонку фланцев, нужно на всякий случай запастись лишними деталями: гайками, болтами для хомута выхлопной трубы, шпильками соединительного фланца.
Не рекомендуется проводить самостоятельный тюнинг при отсутствии знаний и навыков замены выхлопной системы автомобиля. Это может привести к негативным последствиям, а также потери денежных средств. Специализирующиеся на автотюнинге салоны сделают эту работу быстрее и профессиональнее. В основном они предлагают приемлемые цены, доступные для любого кармана. За даунпайп наоборот придется выложить круглую сумму.
Устанавливать даунпайп или обойтись системой, установленной производителем автомобиля, решать владельцам. От смены деталей улучшений может и не произойти. Современные автомобили оснащены высокоэффективной выхлопной системой, которую, возможно, не стоит менять. В любом случае, установка даунпайпа не помешает и не повредит эффективной работе автомобиля.