使用asyncstorage.getItem的react-native array.map

时间:2017-12-23 22:44:15

标签: sqlite react-native asyncstorage

我一直在尝试使用react native来从asyncstorage中检索数据。

这是我到目前为止所做的:

import React, { Component } from 'react';

import {
  Text,
} from 'react-native';

class GetData extends Component {
  constructor() {
    super()
    this.state = {
      dataLocalIds: [
        "data1Data",
        "data2Data",
        "data3Data",
        "data4Data",
        "data5Data",
        "data6Data"
      ],
    }

    this.state.dataLocalIds.map((value, index) => {
      this.data = this.getDatas(value, index);
    })
  }

  async getDatas(value, index) {
    try {
      const value = await AsyncStorage.getItem(value).then(val => {
        return JSON.parse(val)
      });
      return value
    } catch (err) {
      throw err
    }
  }

  renderScreen = () => {
      return (
        <Text> Hello World </Text>
      );
  }

  render() {
    return (
      this.renderScreen()
    );
  }
}

export default GetData;

问题是:应用程序因错误而崩溃,“索引1处的绑定值为空”。

Stacktrace不指向我的代码中的行。相反,它指向sqlite和asyncstorage。

我真的不知道如何解决这个问题。帮助将不胜感激。

4 个答案:

答案 0 :(得分:2)

你好MacFlyer你尝试过使用multiget(https://facebook.github.io/react-native/docs/asyncstorage.html#multiget)吗?

答案 1 :(得分:0)

由于你的getData()方法的参数名称可能导致它的值,并且你在try块中声明了一个新的变量const值。

当值传递给AsyncStorage时,如果发现声明了变量(JS解析和标记化阶段),它会搜索对立即范围的引用(try block),但其值为undefined。所以undefined被传递给AsyncStorage.getItem方法。

尝试重命名其中一个。

答案 2 :(得分:0)

1)我认为构造函数中的this.myFunction = this.myFunction.bind(this)可以解决。

你还有另外一个问题。

Getdatas函数是异步并返回promise 2)

const promises = this.state.dataLocalIds.map((value, index) => this.getDatas(value, index));
const [data1, data2, ] = await Promise.all(promises)

3)名为value的变量已在geDatas范围

中声明

尝试修复并告知我们

答案 3 :(得分:0)

尝试类似:

constructor(){
    super();

    this.state={...}
    this.getDataFromAsyncStorage()
}
async getDataFromAsyncStorage() {
    let dataArray = [];
    for (let value of this.state.localIds){
        let data = await AsyncStorage.getItem(value);
        dataArray.push(data)
    }
    this.data = dataArray;
}