aboutsummaryrefslogtreecommitdiff
path: root/files/ru/web/javascript/guide/using_promises/index.html
diff options
context:
space:
mode:
Diffstat (limited to 'files/ru/web/javascript/guide/using_promises/index.html')
-rw-r--r--files/ru/web/javascript/guide/using_promises/index.html40
1 files changed, 20 insertions, 20 deletions
diff --git a/files/ru/web/javascript/guide/using_promises/index.html b/files/ru/web/javascript/guide/using_promises/index.html
index d104f15d9e..fea85730ac 100644
--- a/files/ru/web/javascript/guide/using_promises/index.html
+++ b/files/ru/web/javascript/guide/using_promises/index.html
@@ -15,9 +15,9 @@ original_slug: Web/JavaScript/Guide/Ispolzovanie_promisov
<p class="summary">{{jsxref("Promise")}} (промис, англ. "обещание") - это объект, представляющий результат успешного или неудачного завершения асинхронной операции. Так как большинство людей пользуются уже созданными промисами, это руководство начнем с объяснения использования вернувшихся промисов до объяснения принципов создания. </p>
-<p>В сущности, промис - это возвращаемый объект, в который вы записываете два коллбэка вместо того, чтобы передать их функции.</p>
+<p>В сущности, промис - это возвращаемый объект, в который вы записываете два колбэка вместо того, чтобы передать их функции.</p>
-<p>Например, вместо старомодной функции, которая принимает два коллбэка и вызывает один из них в зависимости от успешного или неудачного завершения операции:</p>
+<p>Например, вместо старомодной функции, которая принимает два колбэка и вызывает один из них в зависимости от успешного или неудачного завершения операции:</p>
<pre class="brush: js line-numbers language-js">function doSomethingOldStyle(successCallback, failureCallback) {
console.log("Готово.");
@@ -40,7 +40,7 @@ function failureCallback(error) {
doSomethingOldStyle(successCallback, failureCallback);
</pre>
-<p>…современные функции возвращают промис, в который вы записываете ваши коллбэки:</p>
+<p>…современные функции возвращают промис, в который вы записываете ваши колбэки:</p>
<pre class="brush: js line-numbers language-js">function doSomething() {
return new Promise((resolve, reject) =&gt; {
@@ -65,12 +65,12 @@ promise.then(successCallback, failureCallback);</pre>
<h2 id="Гарантии">Гарантии</h2>
-<p>В отличие от старомодных переданных коллбэков промис дает некоторые гарантии:</p>
+<p>В отличие от старомодных переданных колбэков промис дает некоторые гарантии:</p>
<ul>
- <li>Коллбэки никогда не будут вызваны до <a href="/ru/docs/Web/JavaScript/EventLoop#Никогда_не_блокируется">завершения обработки текущего события</a> в событийном цикле JavaScript.</li>
- <li>Коллбеки, добавленные через .then даже <em>после </em>успешного или неудачного завершения асинхронной операции, будут также вызваны.</li>
- <li>Несколько коллбэков может быть добавлено вызовом .then нужное количество раз, и они будут выполняться независимо в порядке добавления.</li>
+ <li>Колбэки никогда не будут вызваны до <a href="/ru/docs/Web/JavaScript/EventLoop#Никогда_не_блокируется">завершения обработки текущего события</a> в событийном цикле JavaScript.</li>
+ <li>Колбэки, добавленные через .then даже <em>после </em>успешного или неудачного завершения асинхронной операции, будут также вызваны.</li>
+ <li>Несколько колбэков может быть добавлено вызовом .then нужное количество раз, и они будут выполняться независимо в порядке добавления.</li>
</ul>
<p>Но наиболее непосредственная польза от промисов - цепочка вызовов (<em>chaining</em>).</p>
@@ -90,11 +90,11 @@ let promise2 = promise.then(successCallback, failureCallback);
<pre class="brush: js">let promise2 = doSomething().then(successCallback, failureCallback);
</pre>
-<p>Второй промис представляет завершение не только <code>doSomething()</code>, но и функций <code>successCallback</code> или <code>failureCallback</code>, переданных Вами, а они тоже могут быть асинхронными функциями, возвращающими промис. В этом случае все коллбэки, добавленные к <code>promise2</code> будут поставлены в очередь за промисом, возвращаемым <code>successCallback</code> или <code>failureCallback</code>.</p>
+<p>Второй промис представляет завершение не только <code>doSomething()</code>, но и функций <code>successCallback</code> или <code>failureCallback</code>, переданных Вами, а они тоже могут быть асинхронными функциями, возвращающими промис. В этом случае все колбэки, добавленные к <code>promise2</code> будут поставлены в очередь за промисом, возвращаемым <code>successCallback</code> или <code>failureCallback</code>.</p>
<p>По сути, каждый вызванный промис означает успешное завершение предыдущих шагов в цепочке.</p>
-<p>Раньше выполнение нескольких асинхронных операций друг за другом приводило к классической "Вавилонской башне" коллбэков:</p>
+<p>Раньше выполнение нескольких асинхронных операций друг за другом приводило к классической "Вавилонской башне" колбэков:</p>
<pre class="brush: js">doSomething(function(result) {
doSomethingElse(result, function(newResult) {
@@ -105,7 +105,7 @@ let promise2 = promise.then(successCallback, failureCallback);
}, failureCallback);
</pre>
-<p>В современных функциях мы записываем коллбэки в возвращаемые промисы - формируем цепочку промисов:</p>
+<p>В современных функциях мы записываем колбэки в возвращаемые промисы - формируем цепочку промисов:</p>
<pre class="brush: js">doSomething().then(function(result) {
return doSomethingElse(result);
@@ -130,7 +130,7 @@ let promise2 = promise.then(successCallback, failureCallback);
.catch(failureCallback);
</pre>
-<p><strong>Важно:</strong> Всегда возвращайте промисы в return, иначе коллбэки не будут сцеплены и ошибки могут быть не пойманы (стрелочные функции неявно возвращают результат, если скобки {} вокруг тела функции опущены).</p>
+<p><strong>Важно:</strong> Всегда возвращайте промисы в return, иначе колбэки не будут сцеплены и ошибки могут быть не пойманы (стрелочные функции неявно возвращают результат, если скобки {} вокруг тела функции опущены).</p>
<h3 id="Цепочка_вызовов_после_catch">Цепочка вызовов после catch</h3>
@@ -199,17 +199,17 @@ let promise2 = promise.then(successCallback, failureCallback);
<p>Работа данного кода основана на промисах. Для примера здесь используется функция <code>doSomething()</code>, которая встречалась ранее. Вы можете прочитать больше о синтаксисе <a href="https://developers.google.com/web/fundamentals/getting-started/primers/async-functions">здесь</a></p>
-<p>Примисы решают основную проблему  пирамид, обработку всех ошибок, даже вызовов исключений и программных ошибок. Это основа для функционального построения асинхронных операций.</p>
+<p>Промисы решают основную проблему  пирамид, обработку всех ошибок, даже вызовов исключений и программных ошибок. Это основа для функционального построения асинхронных операций.</p>
-<h2 id="Создание_промиса_вокруг_старого_коллбэка">Создание промиса вокруг старого коллбэка</h2>
+<h2 id="Создание_промиса_вокруг_старого_колбэка">Создание промиса вокруг старого колбэка</h2>
<p>{{jsxref("Promise")}} может быть создан с помощью конструктора. Это может понадобится только для старых API.</p>
-<p>В идеале, все асинхронные функции уже должны возвращать промис. Но увы, некоторые APIs до сих пор ожидают успешного или неудачного  коллбека переданных по старинке. Типичный пример: {{domxref("WindowTimers.setTimeout", "setTimeout()")}} функция:</p>
+<p>В идеале, все асинхронные функции уже должны возвращать промис. Но увы, некоторые APIs до сих пор ожидают успешного или неудачного  колбэка переданных по старинке. Типичный пример: {{domxref("WindowTimers.setTimeout", "setTimeout()")}} функция:</p>
<pre><code>setTimeout(() =&gt; saySomething("10 seconds passed"), 10000);</code></pre>
-<p>Смешивание старого коллбэк-стиля и промисов проблематично. В случае неудачного завершения <code>saySomething</code> или программной ошибки, нельзя обработать ошибку.</p>
+<p>Смешивание старого колбэк-стиля и промисов проблематично. В случае неудачного завершения <code>saySomething</code> или программной ошибки, нельзя обработать ошибку.</p>
<p>К с частью мы можем обернуть функцию в промис. Хороший тон оборачивать проблематичные функции на самом низком возможном уровне, и больше никогда их не вызывать на прямую:</p>
@@ -231,7 +231,7 @@ wait(10000).then(() =&gt; saySomething("10 seconds")).catch(failureCallback);</c
<p>Фактически, мы превращаем массив асинхронных функций в цепочку промисов равносильно: <code>Promise.resolve().then(func1).then(func2);</code></p>
-<p>Это также можно сделать, объеденив композицию в функцию, в функциональном стиле программирования:</p>
+<p>Это также можно сделать, объединив композицию в функцию, в функциональном стиле программирования:</p>
<pre><code>const applyAsync = (acc,val) =&gt; acc.then(val);
const composeAsync = (...funcs) =&gt; x =&gt; funcs.reduce(applyAsync, Promise.resolve(x));</code></pre>
@@ -241,7 +241,7 @@ const composeAsync = (...funcs) =&gt; x =&gt; funcs.reduce(applyAsync, Promise.r
<pre><code>const transformData = composeAsync(func1, asyncFunc1, asyncFunc2, func2);
transformData(data);</code></pre>
-<p>В ECMAScript 2017, последовательные композиции могут быть выполненны более простым способом с помощью async/await:</p>
+<p>В ECMAScript 2017, последовательные композиции могут быть выполнены более простым способом с помощью async/await:</p>
<pre><code>for (const f of [func1, func2]) {
await f();
@@ -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(() =&gt; console.log(2));
console.log(1); // 1, 2</code></pre>
@@ -264,7 +264,7 @@ 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>
@@ -295,7 +295,7 @@ doSomething().then(function(result) {
<p>Вторая ошибка это излишняя вложенность, включая первую ошибку. Вложенность также ограничивает область видимости внутренних обработчиков ошибок, если это не то чего хотел разработчик, это может привести к необработанным ошибкам. Примером этого является <a href="https://stackoverflow.com/questions/23803743/what-is-the-explicit-promise-construction-antipattern-and-how-do-i-avoid-it">пример как не нужно создавать обещания</a>, который комбинирует вложенность с чрезмерным использованием конструктора обещаний для оборачивания кода который уже использует промисы.</p>
-<p>Третяя ошибка это забыть закончить цепочку ключевым словом <code>catch</code>. Незаконченные цепочки приводят к необработанным отторжениям обещаний в большинстве браузеров.</p>
+<p>Третья ошибка это забыть закончить цепочку ключевым словом <code>catch</code>. Незаконченные цепочки приводят к необработанным отторжениям обещаний в большинстве браузеров.</p>
<p>Хорошим примером является всегда либо возвращать либо заканчивать цепочки обещаний, и как только вы получаете новое обещание, возвращайте его сразу же, чтобы не усложнять код излишней вложенностью:</p>