在 React 中使用 fetch() 处理承诺?
Handling promises with fetch() in React?
我正在创建我的第一个 MERN 堆栈应用程序,并尝试实现一个简单的 API 从我的 React 前端组件调用我的快速服务器。我有 API 在后端工作,它通过 fetch()
正确发送数据,但我无法在我的 React 组件中解决来自 fetch()
的承诺,使用呼叫不停止射击。我的代码如下所示(假设现在所有 API 都调用 return 虚拟格式,例如 { title: 'foo', ... }
:
import React, { useState } from 'react';
import 'core-js/stable';
import 'regenerator-runtime/runtime';
const getApiData = async (route) => {
try {
let apiData = await fetch(route);
let apiDataJson = await apiData.json();
return apiDataJson;
} catch (err) {
throw new Error('Error on fetch', {
error: err
})
}
}
var retrieve_data = async (route, setterCallback) => {
await getApiData(`/api/${route}`).then((data) => {
console.log('Data retrieved from API')
setterCallback(<div>{data.title}</div>)
}).catch(() => {
setterCallback(<div>ERROR</div>)
})
}
const MyComponent = () => {
const [innerDiv, setinnerDiv] = useState(0);
let data = retrieve_data('myEndpoint', setinnerDiv);
return(
<div>
<h1>Data Retrieved in MyComponent:</h1>
{innerDiv}
</div>
);
}
当我编译上面的组件时,组件成功呈现(即 <MyComponent />
看起来像:
<div>
<h1>Data Retrieved in MyComponent:</h1>
<div>foo</div>
</div>
但是,then
块继续执行(即 'Data retrieved from API'
将数百个 times/second 记录到控制台,直到我关闭应用程序。一旦它执行,我该如何停止执行设置组件了吗?谢谢!
您需要useEffect
来阻止组件重新渲染。尝试这样的事情。
const MyComponent = () => {
const [innerDiv, setinnerDiv] = useState(0);
useEffect(() => {
retrieve_data('myEndpoint', setinnerDiv);
}, []);
return(
<div>
<h1>Data Retrieved in MyComponent:</h1>
{innerDiv}
</div>
);
}
我正在创建我的第一个 MERN 堆栈应用程序,并尝试实现一个简单的 API 从我的 React 前端组件调用我的快速服务器。我有 API 在后端工作,它通过 fetch()
正确发送数据,但我无法在我的 React 组件中解决来自 fetch()
的承诺,使用呼叫不停止射击。我的代码如下所示(假设现在所有 API 都调用 return 虚拟格式,例如 { title: 'foo', ... }
:
import React, { useState } from 'react';
import 'core-js/stable';
import 'regenerator-runtime/runtime';
const getApiData = async (route) => {
try {
let apiData = await fetch(route);
let apiDataJson = await apiData.json();
return apiDataJson;
} catch (err) {
throw new Error('Error on fetch', {
error: err
})
}
}
var retrieve_data = async (route, setterCallback) => {
await getApiData(`/api/${route}`).then((data) => {
console.log('Data retrieved from API')
setterCallback(<div>{data.title}</div>)
}).catch(() => {
setterCallback(<div>ERROR</div>)
})
}
const MyComponent = () => {
const [innerDiv, setinnerDiv] = useState(0);
let data = retrieve_data('myEndpoint', setinnerDiv);
return(
<div>
<h1>Data Retrieved in MyComponent:</h1>
{innerDiv}
</div>
);
}
当我编译上面的组件时,组件成功呈现(即 <MyComponent />
看起来像:
<div>
<h1>Data Retrieved in MyComponent:</h1>
<div>foo</div>
</div>
但是,then
块继续执行(即 'Data retrieved from API'
将数百个 times/second 记录到控制台,直到我关闭应用程序。一旦它执行,我该如何停止执行设置组件了吗?谢谢!
您需要useEffect
来阻止组件重新渲染。尝试这样的事情。
const MyComponent = () => {
const [innerDiv, setinnerDiv] = useState(0);
useEffect(() => {
retrieve_data('myEndpoint', setinnerDiv);
}, []);
return(
<div>
<h1>Data Retrieved in MyComponent:</h1>
{innerDiv}
</div>
);
}