关于AsyncStorage getItem方法的返回值数据类型错误的问题



  • 碰到一个问题,AsyncStorage使用getItem方法可以取到数据,也是String格式的,但是当做返回值return出来之后,程序就报错了,说是返回值需要用Array来接收。

    (1)在这里取的返回值:
    0_1502243223607_WechatI111MG1.jpeg

    (2)取AsyncStorage值的方法:
    0_1502243228432_WechatIMG22.jpeg

    (3)报错:
    0_1502243233178_WechatIMG21.jpeg



  • AsyncStorage.getItem取回来的值是Promise的

    你可以用

    async function getItemInfo(key) {
    const value = await AsyncStorage.getItem(key)
    }

    这种方法来把值取出来



  • @zpyas
    现在写成这样了,但还是只能取到object,不能取到string。。。
    0_1502279880303_WechatIMG2.jpeg
    0_1502279986528_WechatIMG4.jpeg
    0_1502279993170_WechatIMG3.jpeg


  • administrators

    存之前得JSON.stringify
    取出来后得JSON.parse



  • @晴明 这回报了syntaxerror unexpected token o in json position 1;
    我看了下说是已经是json对象了,不能再用JSON.parse()了,但是我想要的是我存进去的value,是一个字符串。。。不是json对象
    0_1502295892617_WechatIMG5.jpeg
    0_1502295901177_WechatIMG6.jpeg
    0_1502295909096_WechatIMG7.jpeg
    0_1502295913871_WechatIMG8.jpeg


  • administrators

    asyncstorage本来就只能存字符串,所以必须stringify把复杂类型转为字符串后才能存,否则对象都会变成[Object object]的字符串(隐式调用Object.toString(),其默认返回[Object object]的字符串)

    而你现在的报错是说JSON解析失败(因为不是一个合法的json字符串,为什么不是,明明setItem的时候已经stringify了啊。因为asyncstorage是一个异步存储,其直接调用返回的是一个promise对象,而不是你之前set的字符串)

    你要么用回调,要么用.then,要么用async/await
    直接调用是拿不到返回值的(因而也不能作为JSON.parse的参数)



  • @晴明 写了.then()也没用,还是对Promise不太熟,我得先研究一下promise。谢啦



  • @ShawnDeveloper

    // 将对象存入storage
    async storeObject(ob1) {
    await AsyncStorage.setItem('key', JSON.stringify(ob1));
    }

    // 从storage取出来
    async getObject() {
    const value = JSON.parse((await AsyncStorage.getItem('key') || "{}");
    console.log(value);
    }

    用 async/await 可以直接将Promise的值取出来



  • @zpyas 打印get方法里的value是可以看到字符串的,但是一return出来就不对了。卡了一个礼拜了,return个值都return不出来,都想放弃了。。。
    保存
    0_1502375621370_WechatIMG10.jpeg
    调用保存方法
    0_1502375567705_WechatIMG15.jpeg
    取值方法:
    0_1502375649853_WechatIMG12.jpeg
    调用取值方法:
    0_1502375677322_WechatIMG13.jpeg
    报错
    0_1502375683557_WechatIMG14.jpeg


  • administrators

    @ShawnDeveloper
    不要还掉在那个return的死胡同里好吗?

    因为是异步的,所以并不能直接在第一时间取到值
    也就是说,必然有一个从空值到有值的两个阶段的变化

    所以把你的这些name都声明到state里
    render中去判断这个state,当它为空时,不渲染userinfo,有值时,再渲染userinfo同时把值写到props里去

    {
       this.state.username && <UserInfo username={this.state.username} ......... />
    }
    

    然后就自然的去getItem,在取到值的时候调用setState去更新state和触发render

    AsyncStorage.getItem('username').then(username => this.setState({username}))
    

    或者

    const username = await AsyncStorage.getItem('username')
    this.setState({username})
    


  • @晴明 茅塞顿开,异步请求居然一直在想怎么return。。。糊涂了
    谢啦


登录后回复