reactjs - ReactJS:调用 fetch() 时未陷入承诺
问题描述
我正在获取的数据有问题。我的 fetch 电话让我没有得到承诺。也就是说,我也不知道我的代码是可能的代码还是好的代码。
我有一个过滤栏,用户可以在其中选择两个日期,这意味着我将这些输入字段放在一个表单中,再次不确定我是否应该这样做,但这样我现在在我的表单上有一个 onSubmit。这个 onSubmit 接受我的函数 handleSubmit,它调用我的 fetch。
import React, { Component } from 'react';
import { SplitButton, Dropdown, Container } from 'react-bootstrap';
import CarCard from '../components/results/CarCard'
//YYYY-MM-DD
class SearchBar extends Component {
state = {
fromDate: '',
toDate: '',
data: [],
}
handleSubmit = event => {
event.preventDefault();
this.getData()
}
handleChange = event => {
const target = event.target;
const value = target.value;
const name = target.name;
this.setState({ [name]: value });
}
getData = () => {
const { toDate, fromDate } = this.state
var url = 'https://www.fenonline.dk/SYS_Backend/api/car/'
url += fromDate + "/"
url += toDate
const data_promise = fetch(url).then(handleHttpErrors)
data_promise.then(data => this.setState({ data }))
}
render() {
return (
<Container>
<Container style={styles.container} fluid={true} >
<form onSubmit={this.handleSubmit}>
<h5 style={{ color: 'white', }}>Search for your rental here:</h5>
<input type="date" label="test" name='fromDate' onChange={this.handleChange} />
<input type="date" placeholder={this.state.toDate} name='toDate' onChange={this.handleChange} />
<input type='submit' value='search' />
</form>
</Container>
<Container>
{carCardItems(this.state.data) || 'Please wait...'}
</Container>
</Container>
);
}
}
export default SearchBar;
const carCardItems = data => {
const items = data.map(c =>
<CarCard key={c.regno} {...c} />
);
return items;
};
function handleHttpErrors(res) {
if (!res.ok) {
return Promise.reject({ status: res.status, fullError: res.json() })
}
return res.json();
}
解决方案
也许您可以重写getData()
usingasync/await
以更好地捕获未捕获的错误/承诺的所有可能代码路径:
/* Define async function */
getData = async () => {
/* This try block will encapsulate the fetch logic, and capture all errors
that can be thrown */
try {
const { toDate, fromDate } = this.state
var url = 'https://www.fenonline.dk/SYS_Backend/api/car/'
url += fromDate + "/"
url += toDate
/* Use await instead of promise.then */
const response = await fetch(url)
/* The json() function is async, so use await */
const json = await response.json()
/* If response failed, return error data in same format as in your
Promise.reject() */
if(!response.ok) {
throw { status: response.status, fullError: json }
}
/* Update data with json */
this.setState({ data : json })
}
catch(error) {
/* Log error to console */
console.error(error)
}
}
另请注意,这response.json()
是一个异步方法,这意味着您需要通过await
如上所示(或作为 promise; res.json().then(...)
)调用它。这意味着这样做:
return Promise.reject({ status: res.status, fullError: res.json() })
如您的代码所示,将意味着 的值fullError
是一个Promise
对象,而不是预期的 JSON 数据
推荐阅读
- java - Android App 中 RecyclerView 适配器的问题
- html - 请帮我设置 HTML 中空行的高度
- python - 在 Python/Pandas 中,将自定义函数应用于输入包含字符串的数据框列的最有效方法是什么?
- anylogic - 如何在 Anylogic 中读取 .FIS 文件 (MATHLAB) 并使用 jFuzzyLogic.FIS 执行 FUZZY 建模?
- python - 如何通过函数修改全局列表而不返回值
- sql - Oracle:根据最近的时间戳获取结果
- activerecord - find_each 方法有其他替代方法吗?
- python - 使用 dict 更改月份数据框值
- vba - 指向字符串的长指针
- python - 如何修复多处理器类型错误:“列表”对象不可调用