You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
@@ -50,7 +50,7 @@ let promise = new Promise(function(resolve, reject) {
```js
let promise = new Promise(function(resolve, reject) {
// эта функция выполнится автоматически, при вызове new Promise
// эта функция выполнится автоматически при вызове new Promise
// через 1 секунду сигнализировать, что задача выполнена с результатом "done"
setTimeout(() => *!*resolve("done")*/!*, 1000);
Expand DownExpand Up
@@ -213,21 +213,21 @@ promise.catch(alert); // выведет "Error: Ошибка!" спустя од
## Очистка: finally
По аналогии с блоком `finally` из обычного `try {...} catch {...}`, у промисов также есть метод `finally`.
По аналогии с блоком `finally` из обычного `try {...} catch {...}` у промисов также есть метод `finally`.
Вызов `.finally(f)` похож на `.then(f, f)`, в том смысле, что `f` выполнится в любом случае, когда промис завершится: успешно или с ошибкой.
Идея `finally` состоит в том, чтобы настроить обработчик для выполнения очистки/доведения после завершения предыдущих операций.
Например, остановка индикаторов загрузки, закрытие больше не нужных соединений и т.д.
Думайте об этом как о завершении вечеринки. Независимо от того, была ли вечеринка хорошей или плохой, сколько на ней было друзей, нам все равно нужно (или, по крайней мере, мы должны) сделать уборку после нее.
Думайте об этом как о завершении вечеринки. Независимо от того, была ли вечеринка хорошей или плохой, сколько на ней было друзей, нам всё равно нужно (или, по крайней мере, мы должны) сделать уборку после неё.
Код может выглядеть следующим образом:
```js
new Promise((resolve, reject) => {
/* сделать что-то, что займёт время, и после вызвать resolve или может reject */
/* сделать что-то, что займёт время, и после вызвать resolve или, может, reject */
})
*!*
// выполнится, когда промис завершится, независимо от того, успешно или нет
Expand DownExpand Up
@@ -257,7 +257,7 @@ new Promise((resolve, reject) => {
.then(result => alert(result)); // <-- .then показывает "value"
```
Как вы можете видеть, значение возвращаемое первым промисом, передается через `finally` к следующему `then`.
Как вы можете видеть, значение, возвращаемое первым промисом, передаётся через `finally` к следующему `then`.
Это очень удобно, потому что `finally` не предназначен для обработки результата промиса. Как уже было сказано, это место для проведения общей очистки, независимо от того, каков был результат.
Expand All
@@ -273,15 +273,15 @@ new Promise((resolve, reject) => {
3. Обработчик `finally` также не должен ничего возвращать. Если это так, то возвращаемое значение молча игнорируется.
Единственным исключением из этого правила является случай, когда обработчик `finally` выдает ошибку. Затем эта ошибка передается следующему обработчику вместо любого предыдущего результата.
Единственным исключением из этого правила является случай, когда обработчик `finally` выдаёт ошибку. Затем эта ошибка передаётся следующему обработчику вместо любого предыдущего результата.
Подведем итог:
Подведём итог:
- Обработчик `finally` не получает результат предыдущего обработчика (у него нет аргументов). Вместо этого этот результат передается следующему подходящему обработчику.
- Обработчик `finally` не получает результат предыдущего обработчика (у него нет аргументов). Вместо этого результат передаётся следующему подходящему обработчику.
- Если обработчик `finally` возвращает что-то, это игнорируется.
- Когда `finally` выдает ошибку, выполнение переходит к ближайшему обработчику ошибок.
- Когда `finally` выдаёт ошибку, выполнение переходит к ближайшему обработчику ошибок.
Эти функции полезны и заставляют все работать правильно, если мы используем `finally` так, как предполагается: для общих процедур очистки.
Эти функции полезны и заставляют всё работать правильно, если мы используем `finally` так, как предполагается: для общих процедур очистки.
Если промис в состоянии ожидания, обработчики в `.then/catch/finally` будут ждать его.
Expand DownExpand Up
@@ -320,7 +320,7 @@ function loadScript(src, callback) {
Теперь перепишем её, используя `Promise`.
Новой функции `loadScript` более не нужен аргумент `callback`. Вместо этого она будет создавать и возвращать объект `Promise`, который перейдет в состояние "успешно завершён", когда загрузка закончится. Внешний код может добавлять обработчики ("подписчиков"), используя `.then`:
Новой функции `loadScript` более не нужен аргумент `callback`. Вместо этого она будет создавать и возвращать объект `Promise`, который перейдёт в состояние "успешно завершён", когда загрузка закончится. Внешний код может добавлять обработчики ("подписчиков"), используя `.then`:
```js run
function loadScript(src) {
Expand DownExpand Up
@@ -354,7 +354,7 @@ promise.then(script => alert('Ещё один обработчик...'));
| Промисы | Колбэки |
|----------|-----------|
| Промисы позволяют делать вещи в естественном порядке. Сперва мы запускаем `loadScript(script)`, и затем (`.then`) мы пишем, что делать с результатом. | У нас должна быть функция`callback` на момент вызова `loadScript(script, callback)`. Другими словами, нам нужно знать что делать с результатом *до того*, как вызовется `loadScript`. |
| Промисы позволяют делать вещи в естественном порядке. Сперва мы запускаем `loadScript(src)`, и затем (`.then`) мы пишем, что делать с результатом. | У нас должна быть функция`callback` на момент вызова `loadScript(src, callback)`. Другими словами, нам нужно знать, что делать с результатом *до того*, как вызовется `loadScript`. |
| Мы можем вызывать `.then` у `Promise` столько раз, сколько захотим. Каждый раз мы добавляем нового "фаната", новую функцию-подписчика в "список подписок". Больше об этом в следующей главе: [](info:promise-chaining). | Колбэк может быть только один. |
Таким образом, промисы позволяют улучшить порядок кода и дают нам гибкость. Но это далеко не всё. Мы узнаем ещё много полезного в последующих главах.
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.