вернуть неопределенное извлечение внутри AsyncStorage - PullRequest
0 голосов
/ 24 сентября 2018

У меня есть приложение-родное приложение, где я выполняю вызов API, где он должен вернуть JSON, но у меня просто неопределенное значение.

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, он просто становится неопределенным.

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

Ответы [ 2 ]

0 голосов
/ 24 сентября 2018

Вы можете использовать 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
});

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

0 голосов
/ 24 сентября 2018

Сначала вам нужно вернуть Обещание, созданное 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 => {...
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...