Коротка відповідь
juniorCallbacks — це функції, що передаються як аргументи і викликаються після завершення асинхронної операції. Promises представляють обіцянку результату, що може бути resolved або rejected, і дозволяють ланцюжити .then/.catch. Async/await синтаксичний сахар над promises, що робить код більш лінійним і читаємим.
Повне пояснення
Що це і навіщо
- Callbacks – найпростіший спосіб обробки асинхронності, але піддається "callback hell".
- Promises – об’єкт, що представляє майбутній результат; забезпечує чистіший ланцюжок обробки.
- Async/await – синтаксичний sugar над promises, дозволяє писати асинхронний код у вигляді синхронного.
Ключові принципи/терміни
then,catch,finally– методи Promise.await– оператор, що блокує виконання до розв’язку Promise.try/catch– обробка помилок у async функціях.
Як це працює
- Callbacks: передається функція, яка викликається після завершення.
- Promises: створюється об’єкт, який переходить у стан
fulfilledабоrejected; ланцюжок обробки виконується асинхронно. - Async/await:
asyncфункція повертає Promise; операторawait«зупиняє» виконання до розв’язку.
Практика і реалізація
// Callback
fs.readFile('file.txt', (err, data) => {
if (err) return console.error(err);
console.log(data);
});
// Promise
fs.promises.readFile('file.txt')
.then(data => console.log(data))
.catch(err => console.error(err));
// async/await
async function read() {
try {
const data = await fs.promises.readFile('file.txt');
console.log(data);
} catch (err) {
console.error(err);
}
}
read();
Тестування
- Для callbacks використовуйте
done()у Jest. - Для promises застосовуйте
.resolves/.rejects. - Для async/await можна просто
await expect(fn()).resolves.toBe(value).
Оптимізація, типові помилки та edge cases
- Callback‑hell: вкладені колбеки.
- Promise‑chain без
return: пропускає проміс. - Необроблені помилки в async функціях:
try/catchабо.catch(). - Пам’ятайте про порядок виконання: callbacks синхронні, promises асинхронні.
Часті помилки (8)
- Відсутність
returnу проміс‑ланцюжку. - Використання
awaitпоза async функцією. - Необроблені помилки в callback‑х.
- Перевантаження стеку через рекурсивні callbacks.
- Застосування
new Promiseбез обробки rejection. - Втрата контексту (
this) у callback‑ах. - Застосування
awaitдо синхронної функції. - Підключення callback‑у після завершення операції (наприклад,
setTimeoutз 0).
Cheatsheet
- Callbacks →
function(err, result) {}. - Promises →
.then(),.catch(),.finally(). - Async/await →
async function() { await promise; }.
Follow‑up питання
- Як обробляти паралельні асинхронні запити? –
Promise.all/await Promise.all. - Що таке race condition у контексті promises? –
Promise.race. - Як забезпечити порядок виконання у async/await? – використовуйте послідовні
awaitабоPromise.allдля паралелізму.