Можно ли пометить стрелочную функцию как асинхронную в JavaScript
Что проверяют
Знаете ли вы синтаксис асинхронных функций и понимаете ли, чем стрелочная форма отличается от обычной. Вопрос звучит как ловушка на «да или нет», но проверяют не память, а то, отделяете ли вы ограничения стрелки от ограничений async.
Как отвечать
Да, можно, и это самая частая форма записи:
const load = async () => {
const res = await fetch(url);
return res.json();
};Работают все варианты: стрелка с телом в фигурных скобках и с одним выражением, стрелка в аргументе (items.map(async (x) => check(x))), немедленный вызов (async () => { ... })(), асинхронный метод объекта или класса async load() {}.
Что стоит проговорить самому:
- любая асинхронная функция возвращает промис, даже если внутри нет ни одного
await, аthrowвнутри неё превращается в отклонённый промис; awaitразрешён только внутри асинхронной функции и на верхнем уровне модуля;- ограничения стрелки никуда не деваются: своего
thisиargumentsу неё нет, вызвать черезnewнельзя; - асинхронного стрелочного генератора не существует:
async function* () {}есть, стрелочной записи для него нет.
Где спотыкаются
Путают «стрелку нельзя пометить как асинхронную» и «стрелку нельзя сделать генератором». Второе правда, первое нет, и кандидат уверенно отвечает «нельзя», а следом сам же пишет async () => {} в примере.
Второе: items.map(async (x) => ...) возвращает массив промисов, а не массив значений. Нужен await Promise.all(...), а forEach колбэк вообще не ждёт, и цикл завершается раньше работы внутри него.
Третье: try/catch вокруг вызова асинхронной стрелки без await не поймает ничего. Ошибка уйдёт в промис и всплывёт как необработанное отклонение, обычно в другом месте лога и позже по времени.