diff --git a/js/doka/promise-then/index.md b/js/doka/promise-then/index.md new file mode 100644 index 0000000000..eb8b20c20a --- /dev/null +++ b/js/doka/promise-then/index.md @@ -0,0 +1,67 @@ +--- +title: "Promise. Метод then" +name: promise-then +author: nlopin +summary: + - промис +--- + +Эта статья связана с понятием [Promise](/js/long/promise) + +## Кратко + +Метод `then` используют, чтобы выполнить код после изменения состояния промиса. + +Метод принимает два аргумента: + +- `onFulfill` — функция-колбэк, которая будет вызвана при переходе промиса в состояние «успех» `fulfilled`. Функция имеет один параметр, в который передаётся результат выполнения операции +- `onReject` — функция-колбэк, которая будет вызвана при переходе промиса в состояние «ошибка» `rejected`. Функция имеет один параметр, в который передаётся информация об ошибке + +Всегда возвращает новый промис. + +## Как пишется + +```js +// getPasswords() — асинхронная функция, которая возвращает промис +getPasswords().then( + function (result) { + // что-то делаем с результатом операции + console.log("Все пароли:" + result) + }, + function (err) { + // обрабатываем ошибку + console.error(err.message) + } +) +``` + +## Как понять + +Обработка асинхронных операций через промис и `then` очень похожа на работу с колбэками. + +Так как `then` всегда возвращает новый промис, то его удобно использовать для построения последовательностей асинхронных операций: + +```js +// запросим через API список домов из Игры престолов. Метод `fetch` возвращает промис +fetch('https://www.anapioficeandfire.com/api/houses') + .then(function(response) { + // выполнится, когда от API придет ответ + + // запустим асинхронную операцию парсинга JSON из ответа сервера + return response.json() // вернем из обработчика промис, к которому добавим then + }) + .then(function(houses) { + // выполнится, когда JSON распарсится + + return fetch(houses[0].overlord) // запросим данные о сюзерене этого дома + }) + .then(funciton (response) { + // выполнится, когда от API придет ответ + return response.json() + }) + .then(function(overlord) { + console.log(overlord.name) + }) +``` + +В коде выше, каждый вызов `then` привязан к результату предыдущей операции. Такой код читается почти как синхронный. diff --git a/js/doka/promise-then/practice/nlopin.md b/js/doka/promise-then/practice/nlopin.md new file mode 100644 index 0000000000..d9af9232de --- /dev/null +++ b/js/doka/promise-then/practice/nlopin.md @@ -0,0 +1,16 @@ +--- +tags: + - practice +permalink: false +--- + +🛠 `then` в индустрии используется только для обработки успешного завершения операции, в варианте с одним аргументом: + +```js +getPasswords().then(function (result) { + // что-то делаем с результатом операции + console.log("Все пароли:" + result) +}) +``` + +Для обработки ошибок используют метод [`catch`](/js/doka/promise-catch).