Рендеринг после выполнения обещания [ React Native]

#javascript #reactjs #react-native

#javascript #reactjs #react-native

Вопрос:

В настоящее время я использую AsyncStorage (https://facebook.github.io/react-native/docs/asyncstorage ) для локальной загрузки некоторых данных.

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

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

В моих журналах я вижу следующий вывод:

 Item Returned:  Promise {
  "_40": 0,
  "_55": null,
  "_65": 0,
  "_72": null,
}
Item Returned:  Array [
  Object {
    "ItemID": "1234",
    "ItemName": "Big Fluffy Bear",
  },
]
  

Этот вывод извлекается путем вызова консоли.войдите в систему только один раз (в моей функции рендеринга):

 console.log("Item Returned: ", this.state.itemsStoredLocally);
  

Способ инициализации данных находится в моем конструкторе в моем наборе.Состояние:

 this.state = {
  itemsStoredLocally: loadItems().then(
    data => this.setState({
      itemsStoredLocally: data
    }))
};
  

В настоящее время происходит рендеринг страницы до того, как обещание будет выполнено. Как я могу гарантировать, что моя страница ожидает загрузки ПОСЛЕ выполнения обещания?

Ответ №1:

Обещание всегда разрешается асинхронно, поэтому вы не можете разрешить его и установить в исходное состояние компонента.

Вы можете ввести значение по умолчанию в state и вместо этого вызвать loadItems in componentDidMount и перевести элементы в состояние, когда обещание будет выполнено.

Пример

 class MyComponent extends React.Component {
  state = {
    itemsStoredLocally: []
  };

  componentDidMount() {
    loadItems().then(data =>
      this.setState({
        itemsStoredLocally: data
      })
    );
  }

  render() {
    const { itemsStoredLocally } = this.state;

    if (itemsStoredLocally.length === 0) {
      return null;
    }
    return <> {/* ... */} </>;
  }
}