反应本机中未处理的承诺拒绝错误?

Posted

技术标签:

【中文标题】反应本机中未处理的承诺拒绝错误?【英文标题】:Unhandled promise rejection error in react native? 【发布时间】:2019-02-09 12:37:07 【问题描述】:

我正在使用 axios 从 API 端点获取数据。我收到错误 -> 可能未处理的承诺拒绝类型错误:未定义不是函数(评估 res.json() )

我正在将 react-redux 和 redux-thunk 与 react native 应用程序一起使用。

venueAction.js:

import  FETCH_VENUES  from './types';
import axios from 'axios';

export const fetchVenues = () => dispatch => 
    axios.get(`my_api_link`)
    .then( res => res.json())
    .then( venues => 
        dispatch(
            type: FETCH_VENUES,
            payload: venues
        )
    )
    .catch( error => 
        console.log(error);
    );
;

查看下面的截图:

【问题讨论】:

【参考方案1】:

需要在响应中调用json() 是Fetch API 的一部分。相反,Axios 实现了XMLHttpRequest,这意味着您不需要这样做。

axios.get(`my_api_link`)
  .then(venues => 
    ...
  );

Axios 是一个 javascript 库,用于从浏览器发出来自 node.js 或 XMLHttpRequests 的 http 请求,它支持 JS ES6 原生的 Promise API。它比 .fetch() 具有的另一个特性是它执行 JSON 数据的自动转换。

如果您使用 .fetch(),则在处理 JSON 数据时有两个步骤。第一个是发出实际请求,然后第二个是在响应上调用 .json() 方法。

— Fetch vs. Axios.js for making http requests 来自 Medium 上的 Jason Arnold

【讨论】:

所以如果我删除 .then( res => res.json()) 它工作正常 :)【参考方案2】:

好的,现在你知道不要像这样编写你的 axios 代码:

export const fetchVenues = () => dispatch => 
    axios.get(`my_api_link`)
    .then( res => res.json())
    .then( venues => 
        dispatch(
            type: FETCH_VENUES,
            payload: venues
        )
    )
    .catch( error => 
        console.log(error);
    );
; 

现在呢?尝试像这样使用 ES8 async/await 语法:

export const fetchVenues = () => async dispatch => 
      try 
        const url = 'http://api.funwithredux.com/';
        let  data  = await axios.get(url);
        dispatch( type: FETCH_VENUES, payload: data );
        console.log(data);
       catch (e) 
        console.log(e);
      
    ;

如您所见,如果您愿意,可以使用 try/catch 语句来捕获任何错误,我肯定会添加控制台日志以确保您也可以从 API 端点获取数据。

【讨论】:

他的抓取技术没有问题。除了个人喜好之外,不需要异步/等待。他只要求删除.then( res => res.json())

以上是关于反应本机中未处理的承诺拒绝错误?的主要内容,如果未能解决你的问题,请参考以下文章

Puppeteer -Getting UnhandledPromiseRejectionWarning:管道中未处理的承诺拒绝

反应本机获取多标记[未处理的承诺拒绝:TypeError:TypeError:未定义不是对象(评估'this.state.markers.map

可能未处理的承诺拒绝(id 0)反应原生

来自本机代码的 mocha 测试中未处理的拒绝

未处理的承诺拒绝:错误:URL 格式错误,无法解析

未处理的承诺拒绝:TypeError:网络请求在expo react native 中失败