У меня есть приложение, поддерживающее реакцию, где я вызываю api, где он должен возвращать JSON, но у меня просто undefined.

export function fetchFromAPI() {
  AsyncStorage.getItem('@token', (errToken, token) => {
    let token = null;

    const requestBody = { token: token };

    return fetch(url, {
      method: 'POST',
      body: JSON.stringify(requestBody)
    })
    .then((response) => response.json())
    .then((responseJSON) => {
      console.log(responseJSON); // <-- this shows the correct JSON data
      return responseJSON;
    }).catch((error) => {
      // console.error(error);
    });
  });
}

Я также называю эту функцию так:

const apiData = fetchFromAPI();

Если я выполняю console.log () внутри функции выборки, он возвращает данные JSON, но если я делаю это с apiData, он просто становится неопределенным.

У кого-нибудь есть идея, почему это так, я делаю что-то не так?

0
isiaatz 24 Сен 2018 в 06:27

2 ответа

Лучший ответ

Вы можете использовать Promise, чтобы получить ответ от функции fetchFromAPI, например

export function fetchFromAPI() {
  return new Promise((resolve, reject) => {
    AsyncStorage.getItem('@token', (errToken, token) => {
      let token = null;

      const requestBody = {
        token: token
      };

      return fetch(url, {
          method: 'POST',
          body: JSON.stringify(requestBody)
        })
        .then((response) => response.json())
        .then((responseJSON) => {
          console.log(responseJSON); // <-- this shows the correct JSON data
          resolve(responseJSON);
        }).catch((error) => {
          reject(error);
        });
    });
  });
}

При вызове fetchFromAPI используйте await, например

const apiData = await fetchFromAPI();

Вы также можете использовать .then для захвата ответа и сохранения его в state, например

fetchFromAPI.then((data) => {
   // use data here
});

Надеюсь, это поможет!

1
Prasun 24 Сен 2018 в 04:03

Во-первых, вам нужно вернуть обещание, созданное getItem:

export function fetchFromAPI() {
  return AsyncStorage.getItem('@token', (errToken, token) => {
    let token = null;

    const requestBody = { token: token };

    return fetch(url, {
      method: 'POST',
      body: JSON.stringify(requestBody)
    })
    .then((response) => response.json())
    .then((responseJSON) => {
      console.log(responseJSON); // <-- this shows the correct JSON data
      return Promise.resolve(responseJSON); // <-- this wraps the JSON into a Promise
    }).catch((error) => {
      // console.error(error);
    });
  });
}

Затем вам нужно вызвать функцию так:

fetchFromAPI().then(apiData => {...
0
Sami Hult 24 Сен 2018 в 04:03