# Что такое Promise?

**Promise** — это объект в JavaScript, который представляет **результат асинхронной операции**  
(то есть того, что завершится **позже**).

Проще:

> **Promise = обещание, что значение будет, но не сразу**

---

## Зачем нужен Promise

В JS много асинхронных вещей:

- запросы к серверу
- таймеры
- чтение файлов
- динамические импорты

Promise позволяет:

- дождаться результата
- обработать успех или ошибку
- не блокировать основной поток

---

## Как выглядит Promise

```ts
const promise = new Promise((resolve, reject) => {
  // асинхронная работа
})

```

У Promise есть **3 состояния**:

<table id="bkmrk-%D0%A1%D0%BE%D1%81%D1%82%D0%BE%D1%8F%D0%BD%D0%B8%D0%B5-%D0%A7%D1%82%D0%BE-%D0%B7%D0%BD%D0%B0%D1%87%D0%B8%D1%82"><thead><tr><th>Состояние</th><th>Что значит</th></tr></thead><tbody><tr><td>`pending`</td><td>в процессе</td></tr><tr><td>`fulfilled`</td><td>успешно выполнен</td></tr><tr><td>`rejected`</td><td>ошибка</td></tr></tbody></table>

---

## Простой пример

```ts
const promise = new Promise((resolve) => {
  setTimeout(() => {
    resolve('Готово!')
  }, 1000)
})

```

Через 1 секунду Promise станет `fulfilled`.

---

## Как использовать Promise

### 1️⃣ `.then() / .catch()`

```ts
promise
  .then(result => {
    console.log(result)
  })
  .catch(error => {
    console.error(error)
  })

```

---

### 2️⃣ `async / await` (современно 👍)

```ts
async function run() {
  const result = await promise
  console.log(result)
}

```

👉 `await`:

- «ставит код на паузу»
- но **не блокирует** браузер

---

## Реальный пример (ты уже видел)

```ts
requestClient.get('/menu/all')

```

Возвращает:

```ts
Promise<Menu[]>

```

Использование:

```ts
const menu = await getAllMenusApi()

```

---

## Что происходит под капотом

```ts
console.log('1')

fetch('/api')
  .then(() => console.log('2'))

console.log('3')

```

Вывод:

```
1
3
2

```

Promise выполняется **позже**, когда стек освободится.

---

## Promise vs синхронный код

<table id="bkmrk-%D0%A1%D0%B8%D0%BD%D1%85%D1%80%D0%BE%D0%BD%D0%BD%D1%8B%D0%B9-%D0%90%D1%81%D0%B8%D0%BD%D1%85%D1%80%D0%BE%D0%BD%D0%BD"><thead><tr><th>Синхронный</th><th>Асинхронный (Promise)</th></tr></thead><tbody><tr><td>Блокирует выполнение</td><td>Не блокирует</td></tr><tr><td>Сразу возвращает значение</td><td>Возвращает Promise</td></tr><tr><td>Просто</td><td>Гибко и эффективно</td></tr></tbody></table>

---

## Частые ошибки ❌

### 🔹 Забыли `await`

```ts
const data = getAllMenusApi() // ❌ Promise

```

### 🔹 Нужно так:

```ts
const data = await getAllMenusApi() // ✅ данные

```

---

## Коротко

> **Promise** — это механизм работы с асинхронным кодом в JavaScript:  
> результат будет **позже**, и JS знает, **когда и как его обработать**.