@molekulyarniy

Объясните принцип работы catchAsync-обертки?

Изучаю error handling в Express и заметил, что многие программисты оборачивают асинхронные функции в другую функцию, которая обычно именуется catchAsync
exports.getTour = catchAsync(async (req, res, next) => {

Так вот, есть несколько моментов, которые я не до конца понимаю касательно функции catchAsync. Допустим, реализуется она так:
module.exports = (fn) => {
  return (req, res, next) => {
    fn(req, res, next).catch(next);
  };
};

1) почему fn нужно оборачивать в еще одну функцию? Почему это не работает так?
module.exports = (fn) => {
  return fn(req, res, next).catch(next);
};

по сути ведь так же возвращается reject?

2) Второй вопрос касательно строки fn(req, res, next).catch(next). Я понимаю, что это укороченная запись catch((err) => next(err)), но как работает запись catch(next), я не понимаю. Да, недостаточно знаком с современным JS, поэтому хотелось бы подробнее почитать про этот момент. Как это называется, и что в данном случае гуглить?
  • Вопрос задан
  • 176 просмотров
Решения вопроса 1
bingo347
@bingo347 Куратор тега JavaScript
Ткнуть в доку лучше готового к копипасте ответа
https://ru.wikipedia.org/wiki/Функция_высшего_порядка
https://habr.com/ru/post/261723/
https://developer.mozilla.org/ru/docs/Web/JavaScri...
https://habr.com/ru/post/439746/

1) почему fn нужно оборачивать в еще одну функцию? Почему это не работает так?

module.exports = (fn) => {
  return fn(req, res, next).catch(next);
};
тут экспортируем функцию, которая принимает как аргумент другую функцию fn и сразу ее вызывает, у результата дергает метод catch и уже его результат возвращает (очевидно это промис, а не функция, как того ожидает express)

module.exports = (fn) => {
  return (req, res, next) => {
    fn(req, res, next).catch(next);
  };
};
тут экспортируем функцию, которая принимает как аргумент другую функцию fn и возвращает новую функцию, только при вызове которой будет вызов fn и метода catch на ее результате.

Второй вопрос касательно строки fn(req, res, next).catch(next). Я понимаю, что это укороченная запись catch((err) => next(err)), но как работает запись catch(next), я не понимаю. Да, недостаточно знаком с современным JS, поэтому хотелось бы подробнее почитать про этот момент. Как это называется, и что в данном случае гуглить?
Это не укороченная запись, ссылка на next напрямую передается в метод catch, без всяких оберток. Это дешевле, так как не создается дополнительная функция, да и цепочка вызовов будет меньше, в случае если catch все же вызовет свой аргумент
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы