Ich erhalte die folgende Fehlermeldung: Possible unhandled promise rejection (id:0: Network request failed
Hier ist der Versprechen-Code, ich sehe nicht, was hier falsch ist, irgendwelche Ideen?
return fetch(url)
.then(function(response){
return response.json();
})
.then(function(json){
return {
city: json.name,
temperature: kelvinToF(json.main.temp),
description: _.capitalize(json.weather[0].description)
}
})
.catch(function(error) {
console.log('There has been a problem with your fetch operation: ' + error.message);
});
}
** Bearbeiten: Ich habe eine Fangfunktion hinzugefügt und einen besseren Fehler erhalten You passed an undefined or null state object; instead, use forceUpdate(). index.ios.js:64 undefined
Hier ist der index.ios.js Code. Die URL ist in Ordnung und gibt mir die richtigen JSON-Daten. Ich kann mit dem Konsolenprotokoll sehen, dass beide region.latitude
und region.longitude
in verfügbar sind Api(region.latitude, region.longitude)
. Ist data
aber undefiniert. Ich bin mir immer noch nicht sicher, was los ist, warum es ein Problem gibt data
und warum es undefiniert ist.
// var React = require('react-native'); --deprecated
// updated
import React from 'react';
// updated
import {
AppRegistry,
MapView,
View,
Text,
StyleSheet,
} from 'react-native';
/*
var {
AppRegistry,
MapView,
View,
Text,
StyleSheet
} = React;
*/ // -- depreciated
var Api = require('./src/api');
var Weather = React.createClass({
getInitialState: function() {
return {
pin: {
latitude: 0,
longitude: 0
},
city: '',
temperature: '',
description: ''
};
},
render: function() {
return <View style={styles.container}>
<MapView
annotations={[this.state.pin]}
onRegionChangeComplete={this.onRegionChangeComplete}
style={styles.map}>
</MapView>
<View style={styles.textWrapper}>
<Text style={styles.text}>{this.state.city}</Text>
<Text style={styles.text}>{this.state.temperature}</Text>
<Text style={styles.text}>{this.state.description}</Text>
</View>
</View>
},
onRegionChangeComplete: function(region) {
this.setState({
pin: {
longitude: region.longitude,
latitude: region.latitude
}
});
Api(region.latitude, region.longitude)
.then((data) => {
console.log(data);
this.setState(data);
});
}
});
var styles = StyleSheet.create({
container: {
flex: 1,
justifyContent: 'center',
alignItems: 'stretch',
backgroundColor: '#F5FCFF'
},
map: {
flex: 2,
marginTop: 30
},
textWrapper: {
flex: 1,
alignItems: 'center'
},
text: {
fontSize: 30
}
});
AppRegistry.registerComponent('weather', () => Weather);
quelle
.catch()
auch hinzu und prüfen Sie, ob der Fehler verschwindet. Referenz: facebook.github.io/react-native/docs/…Antworten:
Die catch-Funktion in Ihrer API sollte entweder einige Daten zurückgeben, die vom Api-Aufruf in der React-Klasse verarbeitet werden könnten, oder einen neuen Fehler auslösen, der mithilfe einer catch-Funktion in Ihrem React-Klassencode abgefangen werden sollte. Letzterer Ansatz sollte ungefähr so aussehen:
return fetch(url) .then(function(response){ return response.json(); }) .then(function(json){ return { city: json.name, temperature: kelvinToF(json.main.temp), description: _.capitalize(json.weather[0].description) } }) .catch(function(error) { console.log('There has been a problem with your fetch operation: ' + error.message); // ADD THIS THROW error throw error; });
Dann in Ihrer Reaktionsklasse:
Api(region.latitude, region.longitude) .then((data) => { console.log(data); this.setState(data); }).catch((error)=>{ console.log("Api call error"); alert(error.message); });
quelle
Network request failed
, das ist der gleiche Fehler, den ich am Anfang bekommen habe. Hmm ... immer noch nicht sicher, was hier los ist.Network request failed
Fehler bekomme ?Sie sollten den catch () am Ende des Api-Aufrufs hinzufügen. Wenn Ihr Code auf catch () trifft, gibt er nichts zurück, sodass die Daten nicht definiert sind, wenn Sie versuchen, setState () darauf zu verwenden. Die Fehlermeldung sagt dir das auch :)
quelle
Laut diesem Beitrag sollten Sie es in XCode aktivieren.
quelle
Fügen Sie hier meine Erfahrung hinzu, die hoffentlich jemandem helfen könnte.
Ich hatte das gleiche Problem mit dem Android-Emulator unter Linux beim Hot-Reload. Der Code war gemäß der akzeptierten Antwort korrekt und der Emulator konnte das Internet erreichen (ich brauchte einen Domainnamen).
Durch manuelles Aktualisieren der App funktionierte sie. Vielleicht hat es etwas mit dem heißen Nachladen zu tun.
quelle
Build-Ordner löschen
projectfile\android\app\build
und Projekt ausführenquelle
In meinem Fall verwende ich ein lokales Django-Backend in IP
127.0.0.1:8000
mit Expo-Start.public domain
Stellen Sie einfach sicher, dass der Server nicht lokal auf Ihrem Computer gehostet istquelle