Задать вопрос
@zlodiak

Как вызывать вложенные асинхронные функции?

Я пытаюсь внутри асинхронной функции вызвать другие асинхронные функции, но получаю следующее сообщение об ошибке:
Can not use keyword 'await' outside an async function

Вот код:

export const setGenderThunk = (gender, login) => {
    return async dispatch => {
        const users = await getUsers || [];     // там внутри fetch
        users.forEach(user => {
            if(user.login === login) {
                const user_ = { ...user, gender: gender };
                await setUser(user_, user.id);      // там тоже внутри fetch
                debugger
                if(result.ok) {
                    dispatch(setGenderAC(user_.gender));
                }
                
            }
        });
    }
}


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

export const setGenderThunk = (gender, login) => {
    return async dispatch => {
        const users = await getUsers || [];
        users.forEach(user => {
            if(user.login === login) {
                const user_ = { ...user, gender: gender };
                ;(async () => {
                    const result = await setUserF(user_, user.id);
                    debugger
                    if(result.ok) {
                        dispatch(setGenderAC(user_.gender));
                    }
                })();
                
            }
        });
    }
}

async function setUserF(user, id) {
    return await setUser(user, id);
}
  • Вопрос задан
  • 299 просмотров
Подписаться 1 Простой Комментировать
Помогут разобраться в теме Все курсы
  • Яндекс Практикум
    Мидл фронтенд-разработчик
    5 месяцев
    Далее
  • Javascript.ru
    Курс по React
    5 недель
    Далее
  • Нетология
    Fullstack-разработчик на Python + нейросети
    20 месяцев
    Далее
Решения вопроса 1
Aetae
@Aetae
Тлен
forEach - синхронный. Либо используйте либы умеющие в асинхронный forEach, либо используйте обычные циклы:
export const setGenderThunk = (gender, login) => {
  return async dispatch => {
    const users = await getUsers || [];     // там внутри fetch
    for(let user of users) {
      if(user.login === login) {
        const user_ = { ...user, gender: gender };
        await setUser(user_, user.id);      // там тоже внутри fetch
        debugger
        if(result.ok) {
          dispatch(setGenderAC(user_.gender));
        }

      }
    };
  }
}


P.S. Второй вариант кстати у вас очень плох: forEach отрабатывает всё равно синхрнно, но при этом единовременно плодит множество асинхронных функций выполняющихся параллельно (которых, само собой, никто не ждёт).
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

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

Похожие вопросы
ITK academy Нижний Новгород
от 50 000 до 90 000 ₽
IT ATLAS Москва
от 200 000 до 250 000 ₽
ITK academy Казань
от 50 000 до 90 000 ₽