React Native:可能未处理的承诺被拒绝


78

我收到以下错误: 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代码。该网址很好,并且为我提供了正确的json数据。我可以在控制台日志中看到region.latituderegion.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);

3
.catch()也添加并查看错误是否消失。参考:facebook.github.io/react-native/docs/…–
伊万·切尔尼赫

1
谢谢。只需.catch(err => err)到.then()为我工作之后。=)
Noby Fujioka,

Answers:


53

api中的catch函数应该返回一些可以由React类中的Api调用处理的数据,或者引发新错误,而应该使用React类代码中的catch函数来捕获新错误。后一种方法应类似于:

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

然后在您的React类中:

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

1
谢谢,我也在api中添加了catch函数,并且它不会抛出错误。奇怪。
特工斑马

1
您是否在console.log之后添加了throw错误(“获取操作存在问题:'+ error.message); 在您的抓取功能中。请参阅在第一个代码段中添加的抛出错误。
while1 8/09/9

阿耶斯,想念,谢谢。错误是Network request failed,这与我刚开始遇到的错误相同。嗯...还是不知道这是怎么回事。
特工斑马

知道为什么我仍然出现Network request failed错误吗?
特工斑马

1
我认为问题出在您的url请求中。在任何地方都不反应。尝试在模拟器浏览器中打开api网址,以确保模拟器能够访问该网址。另外,请确保您的应用传输政策允许http调用。参见stackoverflow.com/questions/31254725/…
while1 8/10/10

3

您应该将catch()添加到Api调用的末尾。当您的代码到达catch()时,它不会返回任何内容,因此当您尝试在其上使用setState()时,数据是不确定的。错误消息实际上也告诉您:)


谢谢,我也在api中添加了catch函数,并且它不会抛出错误。奇怪。
特工斑马

关于网络失败错误...您是否正在仿真器中运行提取?也许由于您本地开发机上的防火墙而无法访问网络?或者,也许android dns无法解析网址-因此请尝试使用IP地址。
hasseio '16

是的,可以在ios模拟器中运行它,没有防火墙。如何尝试使用IP地址?
特工斑马

编辑:对不起,刚才看到的IOS要求......试试这个答案- stackoverflow.com/questions/13542706/...
hasseio

嘿,没问题,谢谢。我试过了,没有帮助:(
斑马特工

3

根据这篇文章,您应该在XCode中启用它。

  1. 在项目浏览器中单击您的项目
  2. 打开信息标签
  3. 单击左侧的向下箭头,进入“应用程序传输安全设置”
  4. 右键单击“应用程序传输安全设置”,然后选择添加行
  5. 对于创建的行,设置键“允许任意加载”,键入boolean,将值设置为YES。

在此处输入图片说明


3

在这里添加我的经验,希望可以对某人有所帮助。

我在Linux上通过热重载在Android模拟器上遇到了相同的问题。根据接受的答案,该代码是正确的,并且模拟器可以访问互联网(我需要一个域名)。

手动刷新该应用程序使其可以工作。因此,也许与热重装有关。



0

就我而言,我127.0.0.1:8000 使用Expo Expo在IP中运行本地Django后端。只需确保您的服务器public domain不在计算机上即可托管

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.