2017-12-23 21 views
1

私は、反応ネイティブを使用してasyncstorageからデータを取得しようとしています。ここでreact-native array.map with 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のバインド値はnullです」。

Stacktraceはコード内の行を指しません。代わりに、sqliteとasyncstorageを指しています。

この問題を解決する方法は実際にはわかりません。ヘルプをいただければ幸いです。

答えて

0

おそらく、あなたのgetData()メソッドの引数名が原因なのは、valueです。また、tryブロック内に新しい変数const値を宣言している可能性があります。

値がAsyncStorageに渡されると、変数が宣言されている(JSの解析およびトークン化フェーズ)が、その値がundefinedであれば、即時スコープ(tryブロック)への参照が検索されます。 undefinedがAsyncStorage.getItemメソッドに渡されます。

名前を変更してみてください。

0

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スコープに

を宣言されて修正し、私たちは

0

を知っているようにしてください何かを試してみてくださいlike:

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; 
} 
+0

また、AsyncStorageがデータを検出したかどうかをチェックすることを追加しましたが、このロジックは現在のコードで直面している問題がないと考えています。 –