Ваш getScreen
возвращает Promise
, поскольку вы используете async/await
. Что вам нужно сделать, так это вызвать getScreen
, когда ваш компонент загружается в первый раз внутри ловушки React.useEffect
, а затем обновить состояние showIntro
после того, как оно разрешится с любым ожидаемым значением.
Использование функции async/await
для «ожидания» разрешения AsyncStorage.getItem("showIntro")
с некоторым значением перед возвратом на самом деле не имеет никакого эффекта - вы все еще имеете дело с Promise
, которое разрешается после завершения «внутреннего» * 1012 *.
Из MDN:
Значение return
- это Promise
, которое будет разрешено со значением, возвращаемым функцией asyn c, или отклонено с созданием исключения из, или не поймать внутри, функция asyn c.
import AsyncStorage from '@react-native-community/async-storage'
const data = [{...}, {...}, {...}]
// no need for `async/await` here, using `async/await`
// turns your `getScreen` function into a `Promise`,
// you get the same exact result, so you might as well
// call your `AsyncStorage.getItem("showIntro")` function
// directly in the `React.useEffect` hook rather than
// through this `getScreen` function
const getScreen = () => {
return AsyncStorage.getItem("showIntro");
}
function App() {
const [showIntro, updateShowIntro] = React.useState(null);
React.useEffect(() => {
getScreen()
.then(result => {
updateShowIntro(result);
});
.catch(/* handle errors appropriately */);
// alternatively, just call `AsyncStorage.getItem("showIntro")` here
// AsyncStorage.getItem("showIntro")
// .then(result => { updateShowIntro(result); })
// .catch(/* handle errors appropriately */);
}, []);
const onDone = () => {
// should `updateShowIntro` be inside `then`?
AsyncStorage.setItem('showIntro', false)
.then(() => {
updateShowIntro(false);
})
.catch(/* handle errors appropriately */);
}
return showIntro ? (
<AppIntroSlider
renderItem={renderItem}
data={data}
onDone={onDone}
/>
) : (
<ShowApp />
);
}
Ссылки: