@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);
}
  • Вопрос задан
  • 253 просмотра
Решения вопроса 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 отрабатывает всё равно синхрнно, но при этом единовременно плодит множество асинхронных функций выполняющихся параллельно (которых, само собой, никто не ждёт).
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

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

Похожие вопросы