2016-11-29 4 views
-1

Ich brauche die Zeichenfolge „this.state.localita“ var „loc“ zu übergeben, um Daten von JSON zu holen.Reagieren Native - Vergeben this.state.var eine Variablen

Wenn ich drucken this.state.localita i die Zeichenfolge lesen kann, aber wenn ich zuweisen, dass es sagt JSON Unhandle Versprechen an die var loc.

componentDidMount() { 
    AsyncStorage.getItem("localita").then((value) => { 
     this.setState({"localita": value}); 
    }).done(); 
    this._refreshData(); 
} 

_refreshData() { 
    var loc = this.state.localita; // Here is the problem 

    fetch('https://query.yahooapis.com/v1/public/yql?q=select%20*%20from%20weather.forecast%20where%20woeid%20in%20(select%20woeid%20from%20geo.places(1)%20where%20text%3D%22' + 
    loc +'%2C%20Italy%22)&format=json&env=store%3A%2F%2Fdatatables.org%2Falltableswithkeys') 

    .then((response) => response.json()) 
    .then((rjson) => { 
     this.setState({ 
     dataSource: this.state.dataSource.cloneWithRows(rjson.query.results.channel.item.forecast) 
     }); 
    }); 
    } 
} 
+0

Haben Sie 'this' an' _refreshData() 'in Ihrem' Konstruktor' gebunden? – peterp

+0

Konstruktor (Stützen) { Super (Requisiten); var ds = neue ListView.DataSource ({rowHasChanged: (r1, r2) => r1! == r2}); this.state = { Datenquelle: ds.cloneWithRows ([]) }; } – Fabiospecial

+0

Sie sollten 'this._refreshData = this._refreshData.bind (this);' weil ES6-Klassen nicht autobind. – peterp

Antwort

0

ich glaube, das Problem ist, dass this.state.localita keinen Wert zu dem Zeitpunkt nicht, dass Sie es erwarten. Die AsyncStorage.get() Methode ist asynchron, aber Sie rufen this._refreshData() synchron auf. Daher hat AsyncStorage.get() wahrscheinlich seine Akzeptanzversprechung nicht ausgelöst, als Sie this.state.localita abfragen.

Was Sie wirklich tun müssen, ist die folgende:

componentDidMount() { 
    AsyncStorage.getItem("localita").then((value) => { 
     this.setState(
      {"localita": value}, 
      this._refreshData.bind(this) 
     ); 
    }); 
} 

_refreshData() { 
    var loc = this.state.localita; // Here is the problem 

    if (! loc) { 
     return 
    } 

    // fetch, etc... 
} 

Dies ruft nur setState einmal die AsyncStorage den Wert Sie brauchen, und dann nur einen Anruf zu Refresh Warteschlangen, nachdem der Zustand aktualisiert wurde. Wir verwenden .bind(this) hier, um sicherzustellen, dass das Verfahren this kennt richtig, als eine Funktionsreferenz vorbei wie ein Rückruf den this Kontext verliert.