{
    "componentChunkName": "component---src-templates-doc-page-js",
    "path": "/docs/ru/JS_API/built_in_functions/bind/",
    "result": {"data":{"site":{"siteMetadata":{"title":"Gatsby-doc-engine"}},"markdownRemark":{"id":"dfccb0dd-3395-587d-9103-9559d3d65b32","excerpt":"bind Функция  предназначена для установки обработчиков.?> Обработчики — особые функции, которые вызываются на различных этапах обработки запроса или при…","html":"<h1>bind</h1>\n<hr>\n<p>Функция <code class=\"language-text\">bind</code> предназначена для установки обработчиков.</p>\n<p class='warn'><strong>Обработчики</strong> — особые функции, которые вызываются на различных этапах обработки запроса или при возникновении внештатных ситуаций в диалоге.</p>\n<h2>Принцип работы</h2>\n<p>Рассмотрим общий принцип работы обработчиков.</p>\n<ol>\n<li>Создается функция, которая как аргумент принимает объект <a href=\"/1.11.7/docs/ru/JS_API/variables/context\"><code class=\"language-text\">$context</code></a> — текущий контекст обработки запроса. В теле функции производятся любые действия, необходимые по сценарию.</li>\n<li>При установке функции в качестве обработчика при помощи функции <code class=\"language-text\">bind</code> указывается его <em>тип</em>. Тип определяет ситуацию, в которой обработчик будет вызван.</li>\n<li>Также при установке обработчик <em>привязывается</em> к определенному пути в иерархии стейтов сценария. По умолчанию это корневой путь <code class=\"language-text\">/</code>.</li>\n<li>Обработчик и вызов функции <code class=\"language-text\">bind</code> помещается либо в отдельный файл с расширением <code class=\"language-text\">.js</code>, который импортируется в сценарий при помощи тега <a href=\"/1.11.7/docs/ru/JAICP_DSL/tags/declarative_tags/require\"><code class=\"language-text\">require</code></a>, либо в тело тега <a href=\"/1.11.7/docs/ru/JAICP_DSL/tags/declarative_tags/init\"><code class=\"language-text\">init</code></a>.</li>\n</ol>\n<p class='warn'>При нахождении контекста бота в стейте, путь к которому начинается так же, как путь, к которому привязана функция-обработчик, она будет вызываться во всех случаях, разрешенных его типом.</p>\n<h2>Синтаксис</h2>\n<p>Функция <code class=\"language-text\">bind</code> принимает 4 аргумента.</p>\n<br>\n<table>\n<thead>\n<tr>\n<th>Аргумент</th>\n<th>Тип</th>\n<th>Описание</th>\n<th>Обязательный</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code class=\"language-text\">type</code></td>\n<td>Строка</td>\n<td>Тип обработчика</td>\n<td>Да</td>\n</tr>\n<tr>\n<td><code class=\"language-text\">handler</code></td>\n<td>Функция</td>\n<td>Функция-обработчик</td>\n<td>Да</td>\n</tr>\n<tr>\n<td><code class=\"language-text\">path</code></td>\n<td>Строка</td>\n<td>Абсолютный путь для привязки обработчика</td>\n<td>Нет</td>\n</tr>\n<tr>\n<td><code class=\"language-text\">name</code></td>\n<td>Строка</td>\n<td>Имя обработчика</td>\n<td>Нет</td>\n</tr>\n</tbody>\n</table>\n<br>\n<p>Рассмотрим пример вызова функции <code class=\"language-text\">bind</code>:</p>\n<div class=\"gatsby-highlight\" data-language=\"js\"><pre class=\"language-js\"><code class=\"language-js\"><span class=\"token function\">bind</span><span class=\"token punctuation\">(</span>\n    <span class=\"token string\">\"postProcess\"</span><span class=\"token punctuation\">,</span>\n    <span class=\"token keyword\">function</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">$context</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n        $context<span class=\"token punctuation\">.</span>session<span class=\"token punctuation\">.</span>lastState <span class=\"token operator\">=</span> $context<span class=\"token punctuation\">.</span>currentState<span class=\"token punctuation\">;</span>\n    <span class=\"token punctuation\">}</span><span class=\"token punctuation\">,</span>\n    <span class=\"token string\">\"/Start\"</span><span class=\"token punctuation\">,</span>\n    <span class=\"token string\">\"Remember last state\"</span>\n<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span></code></pre></div>\n<ul>\n<li>Тип обработчика <code class=\"language-text\">postProcess</code>, переданный в качестве первого аргумента, означает, что он будет вызываться после основного цикла обработки запроса.</li>\n<li>Функция, переданная как второй аргумент, задает целевое действие. В данном случае оно заключается в том, что путь к текущему стейту сохраняется в <a href=\"/1.11.7/docs/ru/JS_API/variables/session\"><code class=\"language-text\">$session</code></a> как предыдущий стейт.</li>\n<li>Обработчик привязывается к пути <code class=\"language-text\">/Start</code>. Он будет вызываться в стейте <code class=\"language-text\">/Start</code> и во всех его дочерних стейтах — например, <code class=\"language-text\">/Start/Hello</code>, <code class=\"language-text\">/Start/Hello/1</code> и т. д.</li>\n</ul>\n<p class='tip'>При привязке к корневому пути обработчик будет вызван при нахождении в <em>любом</em> стейте сценария.</p>\n<h2>Обработчики этапов обработки запроса</h2>\n<p>Обработчики следующих типов вызываются в ходе общего цикла обработки запроса:</p>\n<ul>\n<li><a href=\"#preMatch\"><code class=\"language-text\">preMatch</code></a></li>\n<li><a href=\"#selectNLUResult\"><code class=\"language-text\">selectNLUResult</code></a></li>\n<li><a href=\"#preProcess\"><code class=\"language-text\">preProcess</code></a></li>\n<li><a href=\"#postProcess\"><code class=\"language-text\">postProcess</code></a></li>\n</ul>\n<h3>preMatch</h3>\n<p>Обработчик <code class=\"language-text\">preMatch</code> вызывается перед классификацией запроса. Ниже перечислены основные случаи его использования.</p>\n<h4>Принудительное изменение текущего стейта</h4>\n<p>В следующем примере при обработке запроса в стейте <code class=\"language-text\">/Hello</code> контекст будет переведен в стейт <code class=\"language-text\">/Start</code>. Это может быть полезно при переименовании стейтов для обратной совместимости версий сценария.</p>\n<div class=\"gatsby-highlight\" data-language=\"js\"><pre class=\"language-js\"><code class=\"language-js\"><span class=\"token function\">bind</span><span class=\"token punctuation\">(</span>\n    <span class=\"token string\">\"preMatch\"</span><span class=\"token punctuation\">,</span>\n    <span class=\"token keyword\">function</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">$context</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n        $context<span class=\"token punctuation\">.</span>temp<span class=\"token punctuation\">.</span>targetState <span class=\"token operator\">=</span> <span class=\"token string\">\"/Start\"</span><span class=\"token punctuation\">;</span>\n    <span class=\"token punctuation\">}</span><span class=\"token punctuation\">,</span>\n    <span class=\"token string\">\"/Hello\"</span>\n<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span></code></pre></div>\n<h4>Изменение текста запроса</h4>\n<p>Обработчик из примера ниже добавляет к запросам от авторизованных клиентов суффикс, который позволит при помощи паттернов обработать их в стейтах, недоступных для клиентов без авторизации.</p>\n<div class=\"gatsby-highlight\" data-language=\"js\"><pre class=\"language-js\"><code class=\"language-js\"><span class=\"token function\">bind</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"preMatch\"</span><span class=\"token punctuation\">,</span> <span class=\"token keyword\">function</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">$context</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span>$context<span class=\"token punctuation\">.</span>client<span class=\"token punctuation\">.</span>hasActiveAuthorization<span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n        $context<span class=\"token punctuation\">.</span>request<span class=\"token punctuation\">.</span>query <span class=\"token operator\">+=</span> <span class=\"token string\">\" (клиент авторизован)\"</span><span class=\"token punctuation\">;</span>\n    <span class=\"token punctuation\">}</span>\n<span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span></code></pre></div>\n<p class='tip'>Чтобы иметь возможность изменить текст запроса, задайте специальную настройку в конфигурационном файле <a href=/1.11.7/docs/ru/common/bot_structure/configuration_file  ><code class=\"language-text\">chatbot.yaml</code></a>:</p>\n<div class=\"gatsby-highlight\" data-language=\"yaml\"><pre class=\"language-yaml\"><code class=\"language-yaml\"><span class=\"token key atrule\">nlp</span><span class=\"token punctuation\">:</span>\n  <span class=\"token key atrule\">modifyRequestInPreMatch</span><span class=\"token punctuation\">:</span> <span class=\"token boolean important\">true</span></code></pre></div>\n<h3>selectNLUResult</h3>\n<p>В одном сценарии возможно совместное использование нескольких типов <a href=\"/1.11.7/docs/ru/NLU_core/activation/rules\">правил активации</a>. По умолчанию они срабатывают с заранее заданными приоритетами.</p>\n<p>Обработчик <code class=\"language-text\">selectNLUResult</code> вызывается после классификации запроса и позволяет переопределить механизм выбора нужного правила при одновременном срабатывании правил разных типов.</p>\n<p class='warn'><a href=/1.11.7/docs/ru/NLU_core/activation/selectNLUResult  >Подробнее об обработчике <code class=\"language-text\">selectNLUResult</code></a></p>\n<h3>preProcess</h3>\n<p>Обработчик <code class=\"language-text\">preProcess</code> вызывается после классификации запроса и определения целевого стейта, но перед выполнением действий, заданных в стейте. Например, он может быть использован для инициализации каких-либо данных или проверки предварительных условий для перехода в другие стейты.</p>\n<p>В следующем примере предполагается, что в <code class=\"language-text\">$session</code> хранится параметр громкости устройства. Если громкость не задана, для нее устанавливается значение по умолчанию.</p>\n<div class=\"gatsby-highlight\" data-language=\"js\"><pre class=\"language-js\"><code class=\"language-js\"><span class=\"token keyword\">var</span> <span class=\"token constant\">DEFAULT_VOLUME</span> <span class=\"token operator\">=</span> <span class=\"token number\">40</span><span class=\"token punctuation\">;</span>\n\n<span class=\"token function\">bind</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"preProcess\"</span><span class=\"token punctuation\">,</span> <span class=\"token keyword\">function</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">$context</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span><span class=\"token operator\">!</span>$context<span class=\"token punctuation\">.</span>session<span class=\"token punctuation\">.</span>volume<span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n        $context<span class=\"token punctuation\">.</span>session<span class=\"token punctuation\">.</span>volume <span class=\"token operator\">=</span> <span class=\"token constant\">DEFAULT_VOLUME</span><span class=\"token punctuation\">;</span>\n    <span class=\"token punctuation\">}</span>\n<span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span></code></pre></div>\n<h3>postProcess</h3>\n<p>Обработчик <code class=\"language-text\">postProcess</code> выполняется после завершения обработки запроса и может быть использован, например, для добавления в ответ дополнительных полей или записи статистических данных.</p>\n<p>В приведенном примере обработчик добавляет во все ответы бота в канале <a href=\"/1.11.7/docs/ru/channels/telegram/telegram\">Telegram</a> поле, которое указывает, что к ним применена разметка Markdown.</p>\n<div class=\"gatsby-highlight\" data-language=\"js\"><pre class=\"language-js\"><code class=\"language-js\"><span class=\"token function\">bind</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"postProcess\"</span><span class=\"token punctuation\">,</span> <span class=\"token keyword\">function</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">$context</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span>$context<span class=\"token punctuation\">.</span>response<span class=\"token punctuation\">.</span>channelType <span class=\"token operator\">===</span> <span class=\"token string\">\"telegram\"</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n        $context<span class=\"token punctuation\">.</span>response<span class=\"token punctuation\">.</span>replies <span class=\"token operator\">=</span> $context<span class=\"token punctuation\">.</span>response<span class=\"token punctuation\">.</span>replies<span class=\"token punctuation\">.</span><span class=\"token function\">map</span><span class=\"token punctuation\">(</span><span class=\"token keyword\">function</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">reply</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n            <span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span>reply<span class=\"token punctuation\">.</span>type <span class=\"token operator\">===</span> <span class=\"token string\">\"text\"</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n                reply<span class=\"token punctuation\">.</span>markup <span class=\"token operator\">=</span> <span class=\"token string\">\"markdown\"</span><span class=\"token punctuation\">;</span>\n            <span class=\"token punctuation\">}</span>\n            <span class=\"token keyword\">return</span> reply<span class=\"token punctuation\">;</span>\n        <span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n    <span class=\"token punctuation\">}</span>\n<span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span></code></pre></div>\n<p class='warn'>Из <code class=\"language-text\">postProcess</code> также возможно использовать метод <a href=/1.11.7/docs/ru/JS_API/built_in_services/reactions/transition  ><code class=\"language-text\">$reactions.transition</code></a> для перехода обратно в сценарий и принудительного продолжения обработки запроса.</p>\n<h2>Обработчики ошибок</h2>\n<p>Обработчики ошибок служат для обработки внештатных ситуаций в ходе работы бота:</p>\n<ul>\n<li><a href=\"#onScriptError\"><code class=\"language-text\">onScriptError</code></a></li>\n<li><a href=\"#onDialogError\"><code class=\"language-text\">onDialogError</code></a></li>\n<li><a href=\"#onAnyError\"><code class=\"language-text\">onAnyError</code></a></li>\n</ul>\n<p class='warn'>В теле обработчиков ошибок в поле <code class=\"language-text\">$context.exception.message</code> содержатся сообщения возникших ошибок.</p>\n<h3>onScriptError</h3>\n<p>Обработчик <code class=\"language-text\">onScriptError</code> вызывается при возникновении необработанного исключения в коде на JavaScript. Также его можно использовать для настройки поведения при генерации собственных исключений при помощи инструкции <a href=\"https://developer.mozilla.org/ru/docs/Web/JavaScript/Reference/Statements/throw\" target=\"_blank\" rel=\"noopener noreferrer\"><code class=\"language-text\">throw</code></a>.</p>\n<p>Рассмотрим следующий пример использования обработчика для записи сообщения об ошибке в отчет по сессиям через метод <a href=\"/1.11.7/docs/ru/JS_API/built_in_services/analytics/setSessionData\"><code class=\"language-text\">$analytics.setSessionData</code></a>.</p>\n<div class=\"gatsby-highlight\" data-language=\"js\"><pre class=\"language-js\"><code class=\"language-js\"><span class=\"token function\">bind</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"onScriptError\"</span><span class=\"token punctuation\">,</span> <span class=\"token keyword\">function</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">$context</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n    $analytics<span class=\"token punctuation\">.</span><span class=\"token function\">setSessionData</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"Ошибка\"</span><span class=\"token punctuation\">,</span> $context<span class=\"token punctuation\">.</span>exception<span class=\"token punctuation\">.</span>message<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span></code></pre></div>\n<p class='warn'>После <code class=\"language-text\">onScriptError</code> может быть выполнен обработчик <code class=\"language-text\">postProcess</code>, а также переход в другой стейт при помощи <code class=\"language-text\">$reactions.transition</code>.</p>\n<h3>onDialogError</h3>\n<p>Обработчик <code class=\"language-text\">onDialogError</code> вызывается при возникновении ошибок сценария, не связанных с исключениями на JavaScript. Примеры таких ошибок:</p>\n<br>\n<table>\n<thead>\n<tr>\n<th>Ошибка</th>\n<th>Сообщение об ошибке</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td>Для запроса клиента не определен целевой стейт.</td>\n<td><em>No target state was determined for query</em></td>\n</tr>\n<tr>\n<td>Сделан переход в несуществующий стейт.</td>\n<td><em>State not found for path &#x3C;path></em></td>\n</tr>\n<tr>\n<td>Бот попал в бесконечный цикл переходов по стейтам.</td>\n<td><em>Infinite loop was detected for state &#x3C;state> in postProcess transition</em></td>\n</tr>\n</tbody>\n</table>\n<div class=\"gatsby-highlight\" data-language=\"js\"><pre class=\"language-js\"><code class=\"language-js\"><span class=\"token function\">bind</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"onDialogError\"</span><span class=\"token punctuation\">,</span> <span class=\"token keyword\">function</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">$context</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span>$context<span class=\"token punctuation\">.</span>exception<span class=\"token punctuation\">.</span>message\n            <span class=\"token operator\">&amp;&amp;</span> $context<span class=\"token punctuation\">.</span>exception<span class=\"token punctuation\">.</span>message <span class=\"token operator\">===</span> <span class=\"token string\">\"No target state was determined for query\"</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n        $reactions<span class=\"token punctuation\">.</span><span class=\"token function\">answer</span><span class=\"token punctuation\">(</span>\n            <span class=\"token string\">\"Для запроса «\"</span> <span class=\"token operator\">+</span> $context<span class=\"token punctuation\">.</span>request<span class=\"token punctuation\">.</span>query <span class=\"token operator\">+</span> <span class=\"token string\">\"» не найден стейт!\"</span>\n        <span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n    <span class=\"token punctuation\">}</span>\n<span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span></code></pre></div>\n<p class='warn'>После <code class=\"language-text\">onDialogError</code> может быть выполнен обработчик <code class=\"language-text\">postProcess</code>, а также переход в другой стейт при помощи <code class=\"language-text\">$reactions.transition</code>.</p>\n<h3>onAnyError</h3>\n<p>Обработчик <code class=\"language-text\">onAnyError</code> выполняется в нескольких случаях:</p>\n<ol>\n<li>В коде сценария возникло исключение, для которого не предусмотрен обработчик <code class=\"language-text\">onScriptError</code>.</li>\n<li>В ходе диалога возникла ошибка, для которой не предусмотрен обработчик <code class=\"language-text\">onDialogError</code>.</li>\n<li>Возникла непредвиденная ошибка сервера, не связанная с логикой сценария.</li>\n</ol>\n<div class=\"gatsby-highlight\" data-language=\"js\"><pre class=\"language-js\"><code class=\"language-js\"><span class=\"token function\">bind</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"onAnyError\"</span><span class=\"token punctuation\">,</span> <span class=\"token keyword\">function</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">$context</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token keyword\">var</span> answers <span class=\"token operator\">=</span> <span class=\"token punctuation\">[</span>\n        <span class=\"token string\">\"Что-то пошло не так.\"</span><span class=\"token punctuation\">,</span>\n        <span class=\"token string\">\"Произошла ошибка. Пожалуйста, повторите запрос позже.\"</span><span class=\"token punctuation\">,</span>\n        <span class=\"token string\">\"Все сломалось. Попробуйте еще раз.\"</span>\n    <span class=\"token punctuation\">]</span><span class=\"token punctuation\">;</span>\n    <span class=\"token keyword\">var</span> randomAnswer <span class=\"token operator\">=</span> answers<span class=\"token punctuation\">[</span>$reactions<span class=\"token punctuation\">.</span><span class=\"token function\">random</span><span class=\"token punctuation\">(</span>answers<span class=\"token punctuation\">.</span>length<span class=\"token punctuation\">)</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">;</span>\n    $reactions<span class=\"token punctuation\">.</span><span class=\"token function\">answer</span><span class=\"token punctuation\">(</span>randomAnswer<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span></code></pre></div>\n<p class='tip'>После <code class=\"language-text\">onAnyError</code> обработчик <code class=\"language-text\">postProcess</code> не выполняется. Переход в другой стейт при помощи <code class=\"language-text\">$reactions.transition</code> невозможен.</p>","frontmatter":{"title":"","description":null},"headings":[{"value":"bind"}]}},"pageContext":{"slug":"/docs/ru/JS_API/built_in_functions/bind/","previous":{"fields":{"slug":"/docs/ru/JS_API/built_in_functions/capitalize/"},"frontmatter":{"title":"","description":null}},"next":{"fields":{"slug":"/docs/ru/JS_API/built_in_functions/built_in_functions/"},"frontmatter":{"title":"","description":null}}}},
    "staticQueryHashes": ["1209419333"]}