Функция для отправки запроса к серверу

Оптимизирую свое приложение, в файле для описания всех запросов к серверу написала вот такую функцию

mainReques = async (url, method, body) => {
    try {
      const getAuthFlag = () => {
        if (this.token) {
          return { 'Content-Type': 'application/json;charset=utf-8', Authorization: `Token ${getToken()}` };
        }
        return { 'Content-Type': 'application/json;charset=utf-8' };
      };
      const request = await fetch(url, {
        method,
        headers: getAuthFlag(),
        body: JSON.stringify(body),
      });
      const resp = await request.json();
      return resp;
    } catch {
      throw new Error();
    }
  };

Использую ее при попытке авторизации:

authentication = (email, pass) => {
    try {
      const body = {
        user: {
          email,
          password: pass,
        },
      };
      this.mainRequest(`${какой-то url}`, 'POST', body);
    } catch {
      throw new Error();
    }
  };

В компоненте вызываю так:

const onSubmit = (data) => {
    ApiServices.authentication(data.email, data.password)
      .then((resp) => {
        getUserData(resp.user.username, resp.user.image); // сохраняю данные пользователя в стор
        auth(true); // меняю флаг авторизации
        saveToken(resp.user.token); // сохраняю токен пользователя 
      })
      .catch(() => message.warning('Enter login and password'));
  };

Мне кажется такой код логичным, но при авторизации в браузере выскакивает вот такая ошибка :

введите сюда описание изображения

Насколько я понимаю, ошибка происходит на уровне запроса. Вопрос в том, как ее исправить?


Ответы (1 шт):

Автор решения: Константин Рыбаков

Чтобы authentication заработала так как вы хотите, она должна вернуть Promise. Попробуйте добавить слово async перед объявлением функции authentication. Таким образом функция неявно вернет Promise

const authentication = async (...args) => /*so stuff*/

Или явно создайте Promise и верните его:

const authentication = (...args) => {
    return new Promise((resolve, reject)=>{
      // do stuff
      if (all_is_good)
          resolve(result)
      else 
          reject("something bad")
                
})
}

Обратите внимание, что при явном возвращении Promise функция объявляется без async.

→ Ссылка