> For the complete documentation index, see [llms.txt](https://strctr.gitbook.io/programming/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://strctr.gitbook.io/programming/01-languages/javascript/01-language/e-controls/e4-promises/04.i-promise-then.md).

# 04.i Promise.then()

`Promise.then(onFulfilled, onRejected)` позволяет установить обработчики реакций Promise и всегда возвращает новый Promise, находящийся в состоянии pending до тех пор, пока его обработчики не отработают.

* Вызов обработчиков происходит асинхронно.
* Вызов произойдет когда стек вызовов JS опустеет.
* Если ни один из аргументов не был передан, то будет Promise без обработчиков, но ошибки не будет.

## Resolve with Value

Если обработчик возвращает значение, то Promise переходит в состояние `fulfilled` с этим же значением:

```javascript
const promise = Promise.resolve("Success.");
const pending = promise.then(value => "magic");
pending.then(
  value => console.log("success:", value),
  () => console.log("error")
);
// success: magic
```

## Resolve with Error

Если обработчик выбросил исключение, то Promise переходит в состояние `rejected` с этим же исключением:

```javascript
const promise = Promise.resolve("Success.");
const pending = promise.then(value => {
  throw new Error("error");
});
pending.then(
  () => console.log("success"),
  () => console.log("error")
);
// error
```

## Resolve with Promise

Если обработчик возвращает Promise установленный в состояние `fulfilled`, то Promise перешел в состояние `fulfilled` со значением равным значению установленного Promise:

```javascript
const promise = Promise.resolve("Success.");
const pending = promise.then(value => Promise.resolve("Magic"));
pending.then(
  value => console.log("success:", value),
  () => console.log("error")
);
// success: Magic
```

Если обработчик возвращает ожидающий Promise, то текущий Promise так же будет находится в состоянии ожидания до тех пор, пока нижележащий Promise не будет установлен.

Если обработчик возвращает Promise установленный в состояние `rejected`, то Promise переходит в состояние `rejected` с той же ошибкой, что и возвращенный Promise:

```javascript
const promise = Promise.resolve("Success.");
const pending = promise.then(value => Promise.reject("Magic"));
pending.then(
  value => console.log("success:", value),
  value => console.log("error", value)
);
// error Magic
```
