<?xml version="1.0" encoding="utf-8" ?><rss version="2.0" xmlns:tt="http://teletype.in/" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:media="http://search.yahoo.com/mrss/"><channel><title>Daniil Zaozersky</title><generator>teletype.in</generator><description><![CDATA[Daniil Zaozersky]]></description><image><url>https://teletype.in/files/39/5a/395a2c80-eba6-414a-b1fa-e44f1cebac93.png</url><title>Daniil Zaozersky</title><link>https://teletype.in/@js_by_vladilen</link></image><link>https://teletype.in/@js_by_vladilen?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=js_by_vladilen</link><atom:link rel="self" type="application/rss+xml" href="https://teletype.in/rss/js_by_vladilen?offset=0"></atom:link><atom:link rel="next" type="application/rss+xml" href="https://teletype.in/rss/js_by_vladilen?offset=10"></atom:link><atom:link rel="search" type="application/opensearchdescription+xml" title="Teletype" href="https://teletype.in/opensearch.xml"></atom:link><pubDate>Fri, 23 Oct 2026 23:51:48 GMT</pubDate><lastBuildDate>Fri, 23 Oct 2026 23:51:48 GMT</lastBuildDate><item><guid isPermaLink="true">https://teletype.in/@js_by_vladilen/uCf6llE1J</guid><link>https://teletype.in/@js_by_vladilen/uCf6llE1J?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=js_by_vladilen</link><comments>https://teletype.in/@js_by_vladilen/uCf6llE1J?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=js_by_vladilen#comments</comments><dc:creator>js_by_vladilen</dc:creator><title>Краткое введение в pipe () и compose () в JavaScript</title><pubDate>Mon, 12 Apr 2021 12:14:32 GMT</pubDate><media:content medium="image" url="https://teletype.in/files/4e/9e/4e9e7ecb-efe7-43a4-8b3a-a2ff8d65a25c.jpeg"></media:content><description><![CDATA[<img src="https://teletype.in/files/49/dc/49dc1c3f-fe53-4e92-9b93-1d61c102dfe6.jpeg"></img>Концепция pipe проста - сочетание n функций в себе. Это конвейер, идущий слева на право, вызывающий каждую функцию с выводом последней. ]]></description><content:encoded><![CDATA[
  <figure class="m_custom">
    <img src="https://teletype.in/files/49/dc/49dc1c3f-fe53-4e92-9b93-1d61c102dfe6.jpeg" width="1399" />
    <figcaption>Abstract вектор создан(а) macrovector - <a href="https://vk.com/away.php?utf=1&to=http%3A%2F%2Fru.freepik.com" target="_blank">ru.freepik.com</a></figcaption>
  </figure>
  <h2>Pipe</h2>
  <p>Концепция <code>pipe </code>проста - сочетание <code>n</code> функций в себе. Это конвейер, идущий слева на право, вызывающий каждую функцию с выводом последней. </p>
  <p></p>
  <p>Напишем функцию, которая возвращает чей-то <code>name</code>.</p>
  <pre data-lang="javascript">getName = (person) =&gt; person.name;

getName({ name: &#x27;Buckethead&#x27; });
// &#x27;Buckethead&#x27;</pre>
  <p></p>
  <p>Напишем функцию, которая переводит строки в верхний регистр.</p>
  <pre data-lang="javascript">uppercase = (string) =&gt; string.toUpperCase();

uppercase(&#x27;Buckethead&#x27;);
// &#x27;BUCKETHEAD&#x27;
</pre>
  <p></p>
  <p>Итак, если бы мы хотели получить имя <code>person</code> в верхнем регистре , мы могли  бы написать так:</p>
  <pre data-lang="javascript">name = getName({ name: &#x27;Buckethead&#x27; });
uppercase(name);

// &#x27;BUCKETHEAD&#x27;</pre>
  <p></p>
  <p>Мы можем сократить это действие, исключив промежуточную переменную <code>name</code>.</p>
  <pre data-lang="javascript">uppercase(getName({ name: &#x27;Buckethead&#x27; }));</pre>
  <p></p>
  <p>Уже лучше, но вложения могут стать слишком глубокими и с этим будет не удобно работать. Что, если мы хотим добавить функцию, которая получает первые 6 символов строки?</p>
  <pre data-lang="javascript">get6Characters = (string) =&gt; string.substring(0, 6);

get6Characters(&#x27;Buckethead&#x27;);
// &#x27;Bucket&#x27;</pre>
  <p></p>
  <p>В результате чего:</p>
  <pre data-lang="javascript">get6Characters(uppercase(getName({ name: &#x27;Buckethead&#x27; })));

// &#x27;BUCKET&#x27;;</pre>
  <p></p>
  <p>Давайте сойдемся с ума и добавим ещё функцию для переворота строк.</p>
  <pre data-lang="javascript">reverse = (string) =&gt;
  string
    .split(&#x27;&#x27;)
    .reverse()
    .join(&#x27;&#x27;);

reverse(&#x27;Buckethead&#x27;);
// &#x27;daehtekcuB&#x27;</pre>
  <p></p>
  <p>Теперь у нас есть:</p>
  <pre data-lang="javascript">reverse(get6Characters(uppercase(getName({ name: &#x27;Buckethead&#x27; }))));
// &#x27;TEKCUB&#x27;</pre>
  <p></p>
  <p>Это выглядит немного громоздким...</p>
  <h2>Pipe на помощь!</h2>
  <p>Вместо того, чтобы вклинивать функции внутри функций или создавать кучу промежуточных переменных, давайте используем <code>pipe</code> и всё!</p>
  <pre data-lang="javascript">pipe(
  getName,
  uppercase,
  get6Characters,
  reverse
)({ name: &#x27;Buckethead&#x27; });
// &#x27;TEKCUB&#x27;</pre>
  <p></p>
  <p>Чистое искусство. Это как список дел! </p>
  <p>Давайте разберём.</p>
  <p></p>
  <p>Для демонстрационных целей, будем использовать <code>pipe</code>реализацию из<a href="https://medium.com/javascript-scene/reduce-composing-software-fe22f0c39a1d" target="_blank"> одной статьи Эрика Эллиотта</a>.</p>
  <pre data-lang="javascript">pipe = (...fns) =&gt; (x) =&gt; fns.reduce((v, f) =&gt; f(v), x);</pre>
  <p></p>
  <p>Мы можем передавать <code>n</code> функции по конвейеру. Каждая функция берет результат предыдущей, и всё это сводится к единственному значению.</p>
  <p>Передав, написанные ранее, функции, мы  можем использовать <code>pipe</code>, как это сделали выше:</p>
  <pre data-lang="javascript">pipe(
  getName,
  uppercase,
  get6Characters,
  reverse
)({ name: &#x27;Buckethead&#x27; });
// &#x27;TEKCUB&#x27;</pre>
  <p></p>
  <p>Для пошаговой демонстрации добавим несколько отладчиков и пройдём строка за строкой. </p>
  <pre data-lang="javascript">pipe = (...functions) =&gt; (value) =&gt; {
  debugger;

  return functions.reduce((currentValue, currentFunction) =&gt; {
    debugger;

    return currentFunction(currentValue);
  }, value);
};</pre>
  <p></p>
  <figure class="m_column">
    <img src="https://teletype.in/files/ab/00/ab0024a1-c7be-4636-ac15-d920fadbd67b.png" width="793" />
  </figure>
  <p></p>
  <p>Вызовите <code>pipe</code> с нашими наработками и начнутся чудеса.</p>
  <p></p>
  <figure class="m_column">
    <img src="https://teletype.in/files/b7/cd/b7cda3d3-71fd-4f5b-adfe-ac0e50d03617.png" width="1002" />
  </figure>
  <p></p>
  <p>Проверим локальные переменные. <code>functions</code>представляет собой массив из 4 функций, а <code>value</code> и есть <code>{ name: &#x27;Buckethead&#x27; }</code>.</p>
  <p>Помимо наших параметров в <code>pipe</code> можно использовать любое количество функций. Он просто зациклится и будет вызывать каждую из них.</p>
  <p></p>
  <figure class="m_column">
    <img src="https://teletype.in/files/15/87/15877ca4-020f-4d2f-851f-3915ba95d05c.png" width="772" />
  </figure>
  <p></p>
  <p>В следующем отладчике мы внутри <code>reduce</code>. Здесь <code>currentValue</code>передается <code>currentFunction</code>и возвращается.</p>
  <p>Мы видим результат <code>&#x27;Buckethead&#x27;</code>потому, что <code>currentFunction</code>возвращает <code>.name</code>свойство любого объекта. На данном этапе будет возвращен <code>reduce</code>, а на следующем <code>currentValue</code> уже станет новым . Давайте перейдем к следующему отладчику и посмотрим.</p>
  <p></p>
  <figure class="m_column">
    <img src="https://teletype.in/files/3d/97/3d977e9d-bd6a-49d9-b9d9-a4629f074043.png" width="771" />
  </figure>
  <p></p>
  <p>Теперь <code>currentValue</code>это , <code>‘Buckethead’</code>потому что это то , что нам вернула предыдущая функция. Сейчас <code>currentFunction </code>это <code>uppercase</code>, поэтому<code>&#x27;BUCKETHEAD&#x27;</code>будет в следующем <code>currentValue</code>.</p>
  <p></p>
  <figure class="m_column">
    <img src="https://teletype.in/files/80/35/8035f44c-e185-4aaf-9546-d9b64e1c040a.png" width="771" />
  </figure>
  <p></p>
  <p>По тому же сценарию из<code> ‘BUCKETHEAD’ </code>возьмутся первые 6 символов и передадутся следующей функции.</p>
  <p></p>
  <figure class="m_column">
    <img src="https://teletype.in/files/61/47/614745a6-334e-4f3d-af73-b8294860c363.png" width="767" />
  </figure>
  <p></p>
  <p><code>reverse(‘.aedi emaS’)</code></p>
  <p></p>
  <figure class="m_column">
    <img src="https://teletype.in/files/dc/1e/dc1edbec-d298-499f-a892-e12b7932e4da.png" width="829" />
  </figure>
  <p></p>
  <p>Ура мы это сделали!</p>
  <h2>А что на счёт compose()?</h2>
  <p>Это тот же <code>pipe</code>, просто, в другом направлении.</p>
  <p>Поэтому, если вы хотите получить тот же результат, что и с помощью нашего <code>pipe</code>выше, необходимо произвести все те же действия, но наоборот.</p>
  <pre data-lang="javascript">compose(
  reverse,
  get6Characters,
  uppercase,
  getName
)({ name: &#x27;Buckethead&#x27; });</pre>
  <p></p>
  <p>Обратите внимание, что<code>getName</code> уже последний в цепочке, а <code>reverse</code>первый.</p>
  <p>Вот быстрая реализация <code>compose</code>, снова любезно предоставленная <a href="https://medium.com/javascript-scene/reduce-composing-software-fe22f0c39a1d" target="_blank">Эриком Элиоттом из той же статьи</a>.</p>
  <p></p>
  <p>Перевод <a href="https://www.freecodecamp.org/news/pipe-and-compose-in-javascript-5b04004ac937/" target="_blank">статьи</a> Язида Бзадоу.</p>
  <p></p>
  <hr />
  <p></p>
  <p>Если вы хотите ещё больше познавательного контента из мира Java Script, присоединитесь к Telegram каналу <a href="https://t.me/js_by_vladilen" target="_blank">@js_by_vladilen</a>.</p>

]]></content:encoded></item></channel></rss>