Коллбэки

Коллбэк (callback) — это функция, передаваемая в другую функцию как аргумент и вызываемая позже, когда завершится какая-то операция. Коллбэки были первым способом обработки асинхронных операций в JavaScript.

Как работают коллбэки

Функция, принимающая коллбэк, вызывает его в нужный момент — например, после получения данных или истечения таймера. Это позволяет «подписаться» на завершение операции.

function fetchData(callback) {
  setTimeout(() => {
    const data = { id: 1, name: 'Пример' };
    callback(data);
  }, 1000);
}

fetchData((result) => {
  console.log('Получены данные:', result);
});

Здесь fetchData имитирует задержку, а затем вызывает переданный коллбэк с данными.

Проблемы коллбэков

Ад коллбэков (Callback Hell)

Когда нужно выполнить несколько асинхронных операций последовательно, код быстро становится вложенным и трудночитаемым:

getData((a) => {
  getMoreData(a, (b) => {
    getEvenMoreData(b, (c) => {
      getFinalData(c, (d) => {
        console.log(d);
      });
    });
  });
});

Такой стиль усложняет понимание логики, отладку и рефакторинг.

Сложность обработки ошибок

В коллбэках нет единого механизма обработки ошибок. Часто используется соглашение: первый аргумент — ошибка, второй — данные:

fs.readFile('file.txt', (err, data) => {
  if (err) {
    console.error('Ошибка:', err);
    return;
  }
  console.log(data);
});

Но если забыть проверить err, ошибка может остаться незамеченной.

Нарушение линейности кода

Код перестаёт читаться сверху вниз. Вместо последовательных шагов появляются вложенные блоки, что затрудняет восприятие потока выполнения.

Когда ещё используют коллбэки

Несмотря на недостатки, коллбэки всё ещё применяются:

  • В событиях: button.addEventListener('click', handler)
  • В некоторых API React Native (например, обратные вызовы в нативных модулях)
  • В устаревших библиотеках

Однако для новых проектов рекомендуется использовать промисы или async/await.