Promise.prototype.then()
========================

Метод **`then()`** возвращает `Promise`. Метод может принимать два аргумента: колбэк-функции для случаев выполнения и отклонения промиса.

**Примечание:** Если один или оба аргумента отсутствуют или их значения не функции, то `then` пропустит их и не выбросит ошибку. Если для `Promise`, который переходит в состояние `выполнен` или `отклонён` вызван метод `then`, и у данного метода нет нужного обработчика, то в таком случае `then` просто возвращает промис с состоянием начального `Promise`, для которого `then` был вызван.

Синтаксис
---------
```

p.then(onFulfilled[, onRejected]);

p.then(value => {
  // выполнение
  }, reason => {
  // отклонение
});
```

### Параметры

`onFulfilled` Необязательный

`Function` вызывается, когда `Promise` выполнен. Эта функция принимает один аргумент, значение с которым промис был выполнен. Если значение onFulfilled не функция, то оно автоматически заменяется на "Identity" функцию (возвращает полученный аргумент)

`onRejected` Необязательный

`Function` вызывается, когда `Promise` отклонён. Эта функция принимает один аргумент, значение с которым промис был отклонён. Если значение onRejected не функция, то оно автоматически заменяется на "Thrower" функцию (выбрасывает полученный аргумент как ошибку)

Описание
--------

Так как и метод `then`, и метод `Promise.prototype.catch()` возвращают `Promise`, их можно вызвать цепочкой — эта операция называется *соединение*.

Примеры
-------

### Использование метода `then`


```js
var p1 = new Promise(function (resolve, reject) {
  resolve("Успех!");
  // или
  // reject("Ошибка!");
});

p1.then(
  function (value) {
    console.log(value); // Успех!
  },
  function (reason) {
    console.log(reason); // Ошибка!
  },
);
```

### Соединение

Так как метод `then` возвращает промис (`Promise`), вы можете объединить несколько вызовов `then` в цепочку. Значения возвращаемые из колбэков onFulfilled или onRejected будут автоматически обёрнуты в промис.


```js
var p2 = new Promise(function (resolve, reject) {
  resolve(1);
});

p2.then(function (value) {
  console.log(value); // 1
  return value + 1;
}).then(function (value) {
  console.log(value); // 2
});

p2.then(function (value) {
  console.log(value); // 1
});
```


Вы также можете соединить одну функцию, имеющую подобный с промисами API, с другой функцией.


```js
function fetch\_current\_data() {
  // API функции fetch() возвращает промис. Эта функция
  // имеет аналогичный API, за исключением значения в случае выполнения
  return fetch("current-data.json").then((response) => {
    if (response.headers.get("content-type") != "application/json") {
      throw new TypeError();
    }
    var j = response.json();
    // можем что-нибудь делать с j
    return j; // в случае выполнения промиса, значение
    // передаётся в fetch\_current\_data().then()
  });
}
```


Если onFulfilled возвращает промис, возвращаемое значение может быть выполнено (resolved) / отклонено (rejected) промисом.


```js
function resolveLater(resolve, reject) {
  setTimeout(function () {
    resolve(10);
  }, 1000);
}
function rejectLater(resolve, reject) {
  setTimeout(function () {
    reject(20);
  }, 1000);
}

var p1 = Promise.resolve("foo");
var p2 = p1.then(function () {
  // Возвращает промис, который будет разрешен значением 10 через 1 секунду
  return new Promise(resolveLater);
});
p2.then(
  function (v) {
    console.log("resolved", v); // "resolved", 10
  },
  function (e) {
    // не вызвано
    console.log("rejected", e);
  },
);

var p3 = p1.then(function () {
  // Возвращает промис, который будет отброшен значением 20 через 1 секунду
  return new Promise(rejectLater);
});
p3.then(
  function (v) {
    // не
    console.log("resolved", v);
  },
  function (e) {
    console.log("rejected", e); // "rejected", 20
  },
);
```

Спецификация
------------

| Specification |
| --- |
| ECMAScript Language Specification # sec-promise.prototype.then |

Совместимость с браузерами
--------------------------

BCD tables only load in the browser with JavaScript enabled. Enable JavaScript to view data.

Смотрите также
--------------

* `Promise`
* `Promise.prototype.catch()`