React Native: Возможный отказ от необработанного обещания

Я получаю следующую ошибку: Possible unhandled promise rejection (id:0: Network request failed

Вот код обещания, я не вижу, что здесь не так, есть идеи?

  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);
    });
}

** Редактировать: я добавил функцию catch и получил ошибку получше You passed an undefined or null state object; instead, use forceUpdate(). index.ios.js:64 undefined

Здесь код index.ios.js. URL-адрес в порядке и дает мне правильные данные JSON. По журналу консоли я вижу, что и region.latitude, и region.longitude доступны в Api(region.latitude, region.longitude). Но data не определено. Я до сих пор не уверен, что происходит, почему возникла проблема с data и почему он не определен.

// 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);

Ответ 1

Функция catch в вашем API должна либо возвращать некоторые данные, которые могут быть обработаны вызовом Api в классе React, либо выдавать новую ошибку, которая должна быть перехвачена с помощью функции catch в вашем коде класса React. Последний подход должен выглядеть примерно так:

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;
});

Тогда в вашем классе реагирования:

Api(region.latitude, region.longitude)
  .then((data) => {
    console.log(data);
    this.setState(data);
  }).catch((error)=>{
     console.log("Api call error");
     alert(error.message);
  });

Ответ 2

Вы должны добавить catch() в конец вызова Api. Когда ваш код попадает в catch(), он ничего не возвращает, поэтому данные undefined при попытке использовать setState() на нем. Сообщение об ошибке также сообщает об этом:)

Ответ 3

Согласно этот пост, вы должны включить его в XCode.

  • Нажмите на свой проект в Навигаторе проектов
  • Откройте вкладку "Информация"
  • Нажмите на стрелку вниз влево, чтобы перейти к "Настройки безопасности приложения на транспорте"
  • Щелкните правой кнопкой мыши на "Настройки безопасности приложения на транспорте" и выберите "Добавить строку"
  • Для созданной строки установите ключ "Разрешить произвольные нагрузки", введите значение boolean и значение YES.

введите описание изображения здесь

Ответ 4

Добавление сюда моего опыта, который, надеюсь, может помочь кому-то.

Я испытывал ту же проблему на эмуляторе Android в Linux с горячей перезагрузкой. Код был прав в соответствии с принятым ответом, и эмулятор мог попасть в интернет (мне нужно было доменное имя).

Обновление вручную приложения заставило его работать. Так что, возможно, это связано с горячей перезагрузкой.

Ответ 5

удалить папку сборки projectfile\android\app\build и запустить проект