【问题标题】:Resolving promise issue with react native and Async Storage使用 react native 和 Async Storage 解决 promise 问题
【发布时间】:2021-11-13 14:20:45
【问题描述】:

我已经花了几天时间,在这里阅读了许多文章和答案,我无法理解这一点。以下是我最后一次尝试。

我只需要使用存储在Async Storage中的数据并在App()中使用它

有人可以看看这个简单的 App() 起始代码,并以最简单的方式解释如何在这里解决承诺。

import { StatusBar } from 'expo-status-bar'
import React, { useState, useEffect } from 'react'
import { StyleSheet, Text, View } from 'react-native'
import { Button, Input } from 'react-native-elements'
import Icon from 'react-native-vector-icons/FontAwesome'
import AsyncStorage from '@react-native-async-storage/async-storage'

export default async function App () {
  let [userData, setUserData] = useState({})

  useEffect(() => {
    storeData('test2')
    getItem()
  }, [])

  const storeData = async value => {
    try {
      await AsyncStorage.setItem('@storage_Key', value)
    } catch (e) {
      // saving error
    }
  }

  const getItem = async () => {
    const value = await AsyncStorage.getItem('@storage_Key')
    return value
  }

  userData = getItem()
  console.log(userData)

  return (
    <View style={styles.container}>
      <Text>Local storing: {userData}</Text>
      <StatusBar style='auto' />
    </View>
  )
}

const styles = StyleSheet.create({
  container: {
    flex: 1,
    backgroundColor: '#fff',
    alignItems: 'center',
    justifyContent: 'center'
  }
})

&lt;Text&gt;Local storing: {userData}&lt;/Text&gt; 始终是一个未解决的 proise 对象。

我在之前的代码中取得了一些成功,其中console.log(userData) 确实产生了想要的值,但它在&lt;Text&gt; 中仍然不可用。我就是不明白。

提前谢谢你,请记住我是新来的反应本地人。

编辑: 最新尝试:

import { StatusBar } from 'expo-status-bar'
import React, { useState, useEffect } from 'react'
import { StyleSheet, Text, View } from 'react-native'
import { Button, Input } from 'react-native-elements'
import Icon from 'react-native-vector-icons/FontAwesome'
import AsyncStorage from '@react-native-async-storage/async-storage'

export default async function App () {
  let [userData, setUserData] = useState({})

  const storeData = async value => {
    try {
      await AsyncStorage.setItem('@storage_Key', value)
    } catch (e) {
      // saving error
    }
  }

  storeData('test2')


  const getData = async () => {
    try {
      const value = await AsyncStorage.getItem('@storage_Key')
      if(value !== null) {
        console.log(value)
        return value
      }
    } catch(e) {
      // error reading value
    }
  }
  

  userData = await getData()
  console.log(userData)

  return (
    <View style={styles.container}>
      <Text>Local storing: {userData}</Text>
      <StatusBar style='auto' />
    </View>
  )
}

const styles = StyleSheet.create({
  container: {
    flex: 1,
    backgroundColor: '#fff',
    alignItems: 'center',
    justifyContent: 'center'
  }
})

现在由于某种原因我得到了 4 test2 ,记录了正确的值,但仍然出现错误:

Error: Objects are not valid as a React child (found: object with keys {_U, _V, _W, _X}). If you meant to render a collection of children, use an array instead.

这是一个promise对象,应用构建失败。

【问题讨论】:

    标签: javascript react-native asynchronous promise rect


    【解决方案1】:

    因为您没有在渲染器上设置状态并获取项目,而不是在任何 useEffect 上,这也是一种不好的做法。

    试试这个

    export default async function App () {
      let [userData, setUserData] = useState('')
    
      useEffect(() => {
        storeData('test2')
      }, [])
    
      const storeData = async value => {
        try {
          await AsyncStorage.setItem('@storage_Key', value)
          getItem()
        } catch (e) {
          // saving error
        }
      }
    
      const getItem = async () => {
        const value = await AsyncStorage.getItem('@storage_Key')
        setUserData(JSON.stringify(value))
      }
    
      console.log(userData)
    
      return (
        <View style={styles.container}>
          <Text>Local storing: {userData}</Text>
          <StatusBar style='auto' />
        </View>
      )
    }
    

    【讨论】:

    • 感谢您的回答,但我试过了,仍然得到:错误:对象作为 React 子项无效(找到:带有键 {_U、_V、_W、_X} 的对象)。如果您打算渲染一组子项,请改用数组。现在也根本没有控制台日志
    • 是的,将 useState 值设置为空字符串,因为您无法渲染对象
    • 你也可以复制粘贴我的代码
    • 我没有工作。
    • @ikik 你应该将值从异步存储转换为 JSON.stringify 然后设置它,我已经更新了代码请检查 getItem 函数
    【解决方案2】:

    已修复:

    import { StatusBar } from 'expo-status-bar'
    import React, { useState, useEffect } from 'react'
    import { StyleSheet, Text, View } from 'react-native'
    import { Button, Input } from 'react-native-elements'
    import Icon from 'react-native-vector-icons/FontAwesome'
    import AsyncStorage from '@react-native-async-storage/async-storage'
    
    const storeData = async value => {
      try {
        await AsyncStorage.setItem('@storage_Key', value)
      } catch (e) {
        // saving error
      }
    }
    
    storeData('test2')
    
    
    
    export default function App () {
      let [userData, setUserData] = useState('')
    
      useEffect(() => {
        getData()
      }, [])
    
      const getData = async () => {
        try {
          const value = await AsyncStorage.getItem('@storage_Key')
          if (value !== null) {
            console.log(value)
            setUserData(value)
            userData = value
          }
        } catch (e) {
          // error reading value
        }
      }
    
    
      console.log(userData)
    
      return (
        <View style={styles.container}>
          <Text>Local storing: {userData}</Text>
          <StatusBar style='auto' />
        </View>
      )
    }
    
    const styles = StyleSheet.create({
      container: {
        flex: 1,
        backgroundColor: '#fff',
        alignItems: 'center',
        justifyContent: 'center'
      }
    })
    
    • export default function App () { 中不应该存在异步

    • getData()获取数据应该是在useEffect内部发起的

      useEffect(() => { 存储数据('test2') 获取数据() }, [])

    • 我还在getData()里面设置了状态

      用户数据 = 值

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-10-31
      • 2020-11-25
      • 2019-01-26
      • 2021-07-18
      • 1970-01-01
      相关资源
      最近更新 更多