Реактивный массив array.map с помощью asyncstorage.getItem

Я пытался получить данные из асинхронного хранилища, используя реагировать родной.

Вот что я сделал до сих пор:

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 ответа

Решение

Привет, MacFlyer. Вы пытались использовать multiget ( https://facebook.github.io/react-native/docs/asyncstorage.html)?

1) this.myFunction = this.myFunction.bind(this) в конструкторе мог решить я думаю.

У вас есть другая проблема.

Функция Getdatas является асинхронной и возвращает обещание 2)

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

3) переменная с именем value уже объявлено в области geDatas

Попробуйте исправить и дайте нам знать

Возможно, это вызвано тем, что имя аргумента метода getData() имеет значение value, а также вы объявляете новое значение const переменной внутри блока try.

когда значение передается в AsyncStorage, оно ищет ссылку на непосредственную область (блок try), если находит переменную, объявленную (фаза синтаксического анализа и токена JS), но ее значение undefined, так undefined передается в метод AsyncStorage.getItem.

Попробуйте переименовать один из них.

Попробуйте что-то вроде:

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;
}
Другие вопросы по тегам