React Native fetch() не работает

Я пытаюсь создать приложение React Native, которое извлекает данные из API Google, но у меня возникают некоторые проблемы (необработанное исключение JS: undefined не является объектом (оценка 'responseData[0].destination_addresses') ).

Вот код:

'use strict';

var React = require('react-native');
var {
  AppRegistry,
  StyleSheet,
  Text,
  View,
  TouchableHighlight,
} = React;

var INITIAL_DATA = [
  {city: 'CityName', duration: "0 hours"},
];

var REQUEST_URL = 'https://maps.googleapis.com/maps/api/distancematrix/json?mode=driving&language=en&origins=Austin&destinations=San+Francisco&key=PRIVACY';

var AwesomeProject = React.createClass({
  getInitialState: function() {
    return {
      data: INITIAL_DATA[0],
    };
  },

  componentDidMount: function() {
    this.fetchData();
  },

  fetchData: function() {
    fetch(REQUEST_URL)
      .then((response) => response.json())
      .then((responseData) => {

        this.setState({
          data: { city: responseData[0].destination_addresses[0].rendered, duration: responseData[0].rows[0].elements[0].duration.text.rendered },
        });  
      })
      .done();
  },
  render: function() {
    return (
      <View style={styles.container}>
        <View style={styles.textContainer}>
          <Text style={styles.city}>
            {this.state.data.city}
          </Text>
          <Text style={styles.text}>
            {this.state.data.duration}
          </Text>
        </View>

      </View>
    );
  }
});

var Dimensions = require('Dimensions');
var windowSize = Dimensions.get('window');

var styles = StyleSheet.create({
  container: {
    flex: 1,
    justifyContent: 'center',
    alignItems: 'center',
    backgroundColor: '#FFFFFF',
  },
  textContainer: {
    flex: 1,
    justifyContent: 'center',
    alignItems: 'center',
  },
  city: {
    fontSize: 30,
    textAlign: 'center',
    margin: 10,
  },
  text: {
    fontSize: 18,
    paddingLeft: 20,
    paddingRight: 20,
    textAlign: 'center',
    color: '#333333',
    marginBottom: 5,
  },
  buttonContainer: {
    bottom: 0,
    flex: .1,
    width: windowSize.width,
    backgroundColor: '#eee',
  },
  button: {
    flex: 1,
    alignItems: 'center',
    justifyContent: 'center',
  },
  buttonText: {
    fontSize: 30,
    color: '#666666',
  },
});


AppRegistry.registerComponent('AwesomeProject', () => AwesomeProject);

И это ответ json, который я разбираю:

{
   "destination_addresses" : [ "San Francisco, CA, USA" ],
   "origin_addresses" : [ "Austin, TX, USA" ],
   "rows" : [
      {
         "elements" : [
            {
               "distance" : {
                  "text" : "2,830 km",
                  "value" : 2830409
               },
               "duration" : {
                  "text" : "1 day 1 hour",
                  "value" : 90952
               },
               "status" : "OK"
            }
         ]
      }
   ],
   "status" : "OK"
}

person user3352382    schedule 19.04.2016    source источник
comment
Разве это не должно быть responseData.destination_addresses ?   -  person azium    schedule 19.04.2016
comment
Я получаю то же исключение...   -  person user3352382    schedule 19.04.2016
comment
Что вы имеете в виду под «то же самое», можете ли вы опубликовать фактическое исключение?   -  person azium    schedule 19.04.2016
comment
Также вы делаете destination_addresses[0].rendered, но в ответе нет ключа rendered   -  person azium    schedule 19.04.2016
comment
@azium Я только что попробовал оба решения: я всегда получаю следующее исключение: Необработанное исключение JS: undefined не является объектом (оценка 'responseData[0].destination_addresses')   -  person user3352382    schedule 19.04.2016
comment
Было бы невозможно получить это исключение, если бы вы нигде не поместили responseData[0]   -  person azium    schedule 19.04.2016


Ответы (1)


Я считаю, что вам нужно проверить код состояния.

fetch(REQUEST_URL)
  .then((response) => response.json())
  .then((responseData) => {
    if(responseData.status === "OK"){
    this.setState({
      data: { city: responseData[0].destination_addresses[0].rendered,duration: responseData[0].rows[0].elements[0].duration.text.rendered },
    });  
    }else{
   // Do something
   }
  })
  .done();
person Jackie Huang    schedule 19.04.2016
comment
Теперь я получаю Не могу найти переменную: ответ - person user3352382; 19.04.2016
comment
данные ответа, извините. пропустить данные - person Jackie Huang; 19.04.2016