Ich schreibe eine einfache App, die einige Wetterdaten von einer API erhalten muss. Endpunkt. Ich bin sehr neu in React, deshalb verstehe ich wahrscheinlich nicht, wie ich mit Reactions arbeiten soll.Promise Auflösungsaktion wird spät in ReactJS App ausgelöst
Hier ist mein Code:
var React = require('react');
var Weather = React.createClass({
getInitialState: function() {
console.log('GetInitialState', 'info');
return {
foo : 1,
weatherConditions : "No weather data"
};
},
update: function() {
console.log('Updating State', 'primary');
let self = this;
function httpRequestWeather(url) {
return new Promise(function(resolve, reject) {
var weatherRequest = new XMLHttpRequest();
weatherRequest.open("GET", url, true);
weatherRequest.onreadystatechange = function() {
if (this.status === 200) {
console.log("request finished and response is ready");
console.log(this.response);
// only returns when I post code here
self.setState({
weatherConditions: this.response
});
resolve(this.response);
} else{
reject(new Error("no weather data"));
}
};
weatherRequest.send();
});
}
httpRequestWeather("www.weatherendpoint.con/json").then(function(responseText){
let text = JSON.parse(responseText);
//never gets triggered
self.setState({
weatherConditions: "Hi"
});
}).catch(function(){
//always triggered
self.setState({
weatherConditions: "Buy"
});
});
this.setState({foo: 2});
},
render: function() {
console.log('Render', 'success');
let condition = this.state.weatherConditions;
return (
<div>
<span>{condition} </span>
<span>{this.state.foo} </span>
</div>
)
},
componentWillMount: function() {
console.log('ComponentWillMount', 'warning');
this.update();
},
componentDidMount: function() {
console.log('ComponentDidMount', 'warning');
this.update();
},
shouldComponentUpdate: function() {
console.log('ShouldComponentUpdate', 'info');
return true;
}
});
module.exports = Weather;
Grundsätzlich ist das Problem, dass ich in dieser Funktion self.setState auslösen haben ({Wetterbedingungen: this.response});
Wenn ich versuche, Zustand auf Versprechen zu lösen, werde ich immer ungelöst.
httpRequestWeather("www.weatherendpoint.con/json").then(function(responseText){
let text = JSON.parse(responseText);
//never gets triggered
self.setState({
weatherConditions: "Hi"
});
}).catch(function(){
//always triggered
self.setState({
weatherConditions: "Buy"
});
Was mache ich falsch? Vielen Dank!
Vielen Dank! Das hat geholfen! Ich mache das gerade jetzt und habe noch eine Frage: http://stackoverflow.com/questions/42885936/unexpected-end-of-json-input-on-promise-resolve. Macht es Ihnen etwas aus? – margarita
@margarita nur ein FYI, dass 'React.createClass' in der nächsten Hauptversion veraltet ist. Sie planen, es zu einem separaten Paket herauszuziehen, damit es nach der Veröffentlichung von "16.0.0" noch verwendet werden kann. Sie können ES6 'class' verwenden, um _stateful_-Komponenten zu erstellen. Für weitere Informationen: https://github.com/facebook/react/issues/8854 https://github.com/facebook/react/pull/9232 https://github.com/reactjs/ react-codemod # erklärung-des-neuen-es2015-class-transform-with-property-initializers – rockchalkwushock
Vielen Dank! Ich werde mal schauen! – margarita