diff options
Diffstat (limited to 'files/ru/web/javascript/guide/using_promises/index.html')
-rw-r--r-- | files/ru/web/javascript/guide/using_promises/index.html | 24 |
1 files changed, 12 insertions, 12 deletions
diff --git a/files/ru/web/javascript/guide/using_promises/index.html b/files/ru/web/javascript/guide/using_promises/index.html index fea85730ac..19183e72e9 100644 --- a/files/ru/web/javascript/guide/using_promises/index.html +++ b/files/ru/web/javascript/guide/using_promises/index.html @@ -13,7 +13,7 @@ original_slug: Web/JavaScript/Guide/Ispolzovanie_promisov <p>{{jsSidebar("Руководство по JavaScript")}}{{PreviousNext("Web/JavaScript/Guide/Details_of_the_Object_Model", "Web/JavaScript/Guide/Iterators_and_Generators")}}</p> </div> -<p class="summary">{{jsxref("Promise")}} (промис, англ. "обещание") - это объект, представляющий результат успешного или неудачного завершения асинхронной операции. Так как большинство людей пользуются уже созданными промисами, это руководство начнем с объяснения использования вернувшихся промисов до объяснения принципов создания. </p> +<p class="summary">{{jsxref("Promise")}} (промис, англ. "обещание") - это объект, представляющий результат успешного или неудачного завершения асинхронной операции. Так как большинство людей пользуются уже созданными промисами, это руководство начнём с объяснения использования вернувшихся промисов до объяснения принципов создания. </p> <p>В сущности, промис - это возвращаемый объект, в который вы записываете два колбэка вместо того, чтобы передать их функции.</p> @@ -65,7 +65,7 @@ promise.then(successCallback, failureCallback);</pre> <h2 id="Гарантии">Гарантии</h2> -<p>В отличие от старомодных переданных колбэков промис дает некоторые гарантии:</p> +<p>В отличие от старомодных переданных колбэков промис даёт некоторые гарантии:</p> <ul> <li>Колбэки никогда не будут вызваны до <a href="/ru/docs/Web/JavaScript/EventLoop#Никогда_не_блокируется">завершения обработки текущего события</a> в событийном цикле JavaScript.</li> @@ -134,7 +134,7 @@ let promise2 = promise.then(successCallback, failureCallback); <h3 id="Цепочка_вызовов_после_catch">Цепочка вызовов после catch</h3> -<p>Можно продолжить цепочку вызовов <em>после </em>ошибки, т. е. после <code>catch</code>, что полезно для выполнения новых действий даже после того, как действие вернет ошибку в цепочке вызовов. Ниже приведен пример:</p> +<p>Можно продолжить цепочку вызовов <em>после </em>ошибки, т. е. после <code>catch</code>, что полезно для выполнения новых действий даже после того, как действие вернёт ошибку в цепочке вызовов. Ниже приведён пример:</p> <pre class="syntaxbox"><code class="language-js"><span class="keyword token">new</span> <span class="class-name token">Promise</span><span class="punctuation token">(</span><span class="punctuation token">(</span>resolve<span class="punctuation token">,</span> reject<span class="punctuation token">)</span> <span class="operator token">=</span><span class="operator token">></span> <span class="punctuation token">{</span> console<span class="punctuation token">.</span><span class="function token">log</span><span class="punctuation token">(</span><span class="string token">'</span></code>Начало<code class="language-js"><span class="string token">'</span><span class="punctuation token">)</span><span class="punctuation token">;</span> @@ -221,7 +221,7 @@ wait(10000).then(() => saySomething("10 seconds")).catch(failureCallback);</c <h2 id="Композиция">Композиция</h2> -<p>{{jsxref("Promise.resolve()")}} и {{jsxref("Promise.reject()")}} короткий способ создать уже успешные или отклоненные промисы соответственно. Это иногда бывает полезно.</p> +<p>{{jsxref("Promise.resolve()")}} и {{jsxref("Promise.reject()")}} короткий способ создать уже успешные или отклонённые промисы соответственно. Это иногда бывает полезно.</p> <p>{{jsxref("Promise.all()")}} и {{jsxref("Promise.race()")}} - два метода запустить асинхронные операции параллельно.</p> @@ -236,7 +236,7 @@ wait(10000).then(() => saySomething("10 seconds")).catch(failureCallback);</c <pre><code>const applyAsync = (acc,val) => acc.then(val); const composeAsync = (...funcs) => x => funcs.reduce(applyAsync, Promise.resolve(x));</code></pre> -<p><code>composeAsync</code> функция примет любое количество функций в качестве аргументов и вернет новую функцию которая примет в параметрах начальное значение, переданное по цепочке. Это удобно, потому что некоторые или все функции могут быть либо асинхронными либо синхронными, и они гарантированно выполнятся в правильной последовательности:</p> +<p><code>composeAsync</code> функция примет любое количество функций в качестве аргументов и вернёт новую функцию которая примет в параметрах начальное значение, переданное по цепочке. Это удобно, потому что некоторые или все функции могут быть либо асинхронными либо синхронными, и они гарантированно выполнятся в правильной последовательности:</p> <pre><code>const transformData = composeAsync(func1, asyncFunc1, asyncFunc2, func2); transformData(data);</code></pre> @@ -249,7 +249,7 @@ transformData(data);</code></pre> <h2 id="Порядок_выполнения">Порядок выполнения</h2> -<p>Чтобы избежать сюрпризов, функции, переданные в <code>then</code> никогда не будут вызваны синхронно, даже с уже разрешенным промисом:</p> +<p>Чтобы избежать сюрпризов, функции, переданные в <code>then</code> никогда не будут вызваны синхронно, даже с уже разрешённым промисом:</p> <pre><code>Promise.resolve().then(() => console.log(2)); console.log(1); // 1, 2</code></pre> @@ -264,9 +264,9 @@ console.log(1); // 1, 2, 3, 4</code></pre> <h2 id="Вложенность">Вложенность</h2> -<p>Простые цепочки promise лучше оставлять без вложений, так как вложенность может быть результатом небрежной структуры. Смотрите <a href="https://developer.mozilla.org/ru/docs/Web/JavaScript/Guide/Ispolzovanie_promisov$edit#Common_mistakes">распространенные ошибки</a>.</p> +<p>Простые цепочки promise лучше оставлять без вложений, так как вложенность может быть результатом небрежной структуры. Смотрите <a href="https://developer.mozilla.org/ru/docs/Web/JavaScript/Guide/Ispolzovanie_promisov$edit#Common_mistakes">распространённые ошибки</a>.</p> -<p>Вложенность - это управляющая структура, ограничивающая область действия операторов catch. В частности, вложенный catch только перехватывает сбои в своей области и ниже, а не ошибки выше в цепочке за пределами вложенной области. При правильном использовании это дает большую точность в извлечение ошибок:</p> +<p>Вложенность - это управляющая структура, ограничивающая область действия операторов catch. В частности, вложенный catch только перехватывает сбои в своей области и ниже, а не ошибки выше в цепочке за пределами вложенной области. При правильном использовании это даёт большую точность в извлечение ошибок:</p> <pre><code>doSomethingCritical() .then(result => doSomethingOptional() @@ -291,7 +291,7 @@ doSomething().then(function(result) { }).then(() => doFourthThing()); // Забыл закончить цепочку методом catch</code></pre> -<p>Первая ошибка это неправильно сцепить вещи между собой. Такое происходит когда мы создаем промис но забываем вернуть его. Как следствие, цепочка сломана, но правильнее было бы сказать что теперь у нас есть две независимые цепочки, соревнующиеся за право разрешится первой. Это означает <code>doFourthThing()</code> не будет ждать <code>doSomethingElse()</code> или <code>doThirdThing()</code> пока тот закончится, и будет исполнятся параллельно с ними, это ,вероятно, не то что хотел разработчик. Отдельные цепочки также имеют отдельную обработку ошибок, что приводит к необработанным ошибкам.</p> +<p>Первая ошибка это неправильно сцепить вещи между собой. Такое происходит когда мы создаём промис но забываем вернуть его. Как следствие, цепочка сломана, но правильнее было бы сказать что теперь у нас есть две независимые цепочки, соревнующиеся за право разрешится первой. Это означает <code>doFourthThing()</code> не будет ждать <code>doSomethingElse()</code> или <code>doThirdThing()</code> пока тот закончится, и будет исполнятся параллельно с ними, это ,вероятно, не то что хотел разработчик. Отдельные цепочки также имеют отдельную обработку ошибок, что приводит к необработанным ошибкам.</p> <p>Вторая ошибка это излишняя вложенность, включая первую ошибку. Вложенность также ограничивает область видимости внутренних обработчиков ошибок, если это не то чего хотел разработчик, это может привести к необработанным ошибкам. Примером этого является <a href="https://stackoverflow.com/questions/23803743/what-is-the-explicit-promise-construction-antipattern-and-how-do-i-avoid-it">пример как не нужно создавать обещания</a>, который комбинирует вложенность с чрезмерным использованием конструктора обещаний для оборачивания кода который уже использует промисы.</p> @@ -307,9 +307,9 @@ doSomething().then(function(result) { .then(() => doFourthThing()) .catch(error => console.log(error));</code></pre> -<p>Обратите внимание что <code>() => x</code> это сокращенная форма <code>() => { return x; }</code>.</p> +<p>Обратите внимание что <code>() => x</code> это сокращённая форма <code>() => { return x; }</code>.</p> -<p>Теперь у нас имеется единственная определенная цепочка с правильной обработкой ошибок.</p> +<p>Теперь у нас имеется единственная определённая цепочка с правильной обработкой ошибок.</p> <p>Использование <a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/async_function"><code>async</code>/<code>await</code></a> предотвращает большинство, если не все вышеуказанные ошибки—но взамен появляется другая частая ошибка—забыть ключевое слово <a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/async_function"><code>await</code></a>.</p> @@ -318,5 +318,5 @@ doSomething().then(function(result) { <ul> <li>{{jsxref("Promise.then()")}}</li> <li><a href="http://promisesaplus.com/">Спецификация Promises/A+ (EN)</a></li> - <li><a href="http://pouchdb.com/2015/05/18/we-have-a-problem-with-promises.html">Нолан Лоусон (Nolan Lawson): У нас проблемы с промисами - распространенные ошибки (EN)</a></li> + <li><a href="http://pouchdb.com/2015/05/18/we-have-a-problem-with-promises.html">Нолан Лоусон (Nolan Lawson): У нас проблемы с промисами - распространённые ошибки (EN)</a></li> </ul> |