@BogdanZots

Почему две асинхронных функции внутри redux-thunk выполняются не так как я хочу?

Всем привет все мы знаем , что
const one = async () => { console.log(1) } 
const two = async () => { console.log(2) } 
one()
two() // Выведет 1 потом 2

У меня есть два функции ( redux thunk ) , обе ассинхронны ( ниже прилаживаю код )
export const loginUser = (data) => {  // эта функция отрпавляет запрос на сервер и сетает токен  в лс
  return async function (dispatch) {
    const token = await postLogin(data);
    localStorage.setItem('token', JSON.stringify(token));
    if (token) {
      const decodedToken = jwt_decode(token);
      dispatch(loginUserAC(decodedToken));
    }
  };
};

export const checkAuth = () => { // эта функция берёт токен из лс , и проверяет авт. ли юзер 
  let decodedToken = "";
  return async function (dispatch) {
    const token = JSON.parse(localStorage.getItem('token'));
    if (token) {
      decodedToken = jwt_decode(token);
    }
    dispatch(checkUserAuthAC(decodedToken));
  };
};

я вызываю обе функции по клику
<button
        onClick={() => {
          setEmail("");
          setPassword("");
          dispatch(loginUser(data)); // должна отработать первее
          dispatch(checkAuth()); // должна отработать позже
        }}
        type="button"
      >
        Войти
      </button>

Но почему то dispatch(loginUser(data)); выполняется быстрее ? Кто нибудь может подсказать что я делаю не так ? и как исправить данную ситуацию?
  • Вопрос задан
  • 152 просмотра
Решения вопроса 1
@AndrewRusinas
Всем привет все мы знаем , что

Вообще не факт.

const one = async () => { console.log(1) } 
const two = async () => { console.log(2) } 
await one()
await two() // Выведет 1 потом 2


Вот так - факт.

Метод checkAuth синхронный, смысла делать его async нет.

Вот, что происходит в вашем случае:
dispatch(loginUser(data)); // должна отработать первее


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

dispatch(checkAuth()); // должна отработать позже

Не должна по причине, указанной выше.

Достаточно простого фикса:
onClick={async () => {
          setEmail("");
          setPassword("");
          await dispatch(loginUser(data)); //  теперь мы точно дожидаемся выполнения
          dispatch(checkAuth()); // эту функцию следует просто сделать синхронной, добавлять здесь await не стоит. 
        }}
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

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

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