тогда не жду обещания - PullRequest
0 голосов
/ 06 апреля 2020

У меня есть эта функция с использованием fetch

export async function login(email, password) {
  let url = new URL("http://localhost:8080");
  url.search = new URLSearchParams({
    t: "login",
    email: email,
    password: password
  });

  fetch(url, {
    method: "GET",
    headers: new Headers()
  })
    .then(response => response.text())
    .then(response => {
      console.log(response);
      return response;
    })
    .catch(err => console.log(err));
}

И функция, которая должна вызывать ее и обрабатывать результат, такова:

handleSubmit() {
    login(this.state.email, this.state.password).then(r => {
      console.log(r);
      if (String(r) === "true") this.props.updatePath("/main");
      else this.setState({ current: 1 });
    });
  }

Я новичок в javascript, и я все еще немного смущен асин c вещью. В консоли журнал от второй идет до журнала от первой функции, поэтому я предполагаю, что он не ждет, пока он заработает.

Журнал первой функции выдает правильный результат, я просто не могу перевести его на другую сторону.

Сначала я использовал топор ios (с этим были некоторые проблемы), и этот подход сработал. Есть ли что-то другое в fetch, что мешает этому работать? Любая помощь будет оценена

Ответы [ 2 ]

1 голос
/ 06 апреля 2020

Обещание, возникающее при вызове функции async, разрешается, когда эта функция возвращается. login внутренне ничего не ждет (это, вероятно, ошибка). Возвращается до разрешения внутреннего fetch. Таким образом, пока эта выборка в полете, ваш then обратный вызов в handleSubmit запускается. Позже fetch, инициированный в login, завершает и записывает фактический ответ.

Я бы попросил вас написать login так:

export async function login(email, password) {
  let url = new URL("http://localhost:8080");
  url.search = new URLSearchParams({
    t: "login",
    email: email,
    password: password
  });

  try {
    let response = await fetch(url, {
      method: "GET",
      headers: new Headers()
    });
    response = await response.text();
    console.log(response);
    return response;
  } catch (err) {
    console.log(err);
    // original code had this issue where it doesn't reject on error nor resolve to anything useful
  }
}
0 голосов
/ 06 апреля 2020

await - это очень простая концепция - она ​​просто заставляет вашу функцию синхронно ждать Ожидание. Чтобы использовать это, поставьте await перед любым выражением, которое возвращает Обещание. В вашем случае вы можете вернуть fetch() в вашей функции login(), а затем просто:

await login(this.state.email, this.state.password);
// execution continued when fetch is done
...