Реактивный массив 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;
}