问题
问题是获取请求已解决,但组件已卸载(出于某种原因),因此现在无法进行状态更新。
解决方案
您需要使用Abort Controller来取消进行中的请求。如果组件卸载,效果清除功能将取消获取请求。
useEffect(() => {
const controller = new AbortController(); // <-- create controller
const { signal } = controller; // <-- get signal for request
fetch('/mypost', {
headers: {
cookie: 'access_token',
},
signal, // <-- pass signal with options
})
.then((res) => res.json())
.then((data) => {
setPhoto(data.mypost);
});
return () => controller.abort(); // <-- return cleanup function to abort
}, []);
注意:当abort()
被调用时,fetch()
promise 以
AbortError
.
您可能需要在某处捕获此Promise拒绝。您可以将一个.catch
块附加到 Promise 链。
fetch('/mypost', {
headers: {
cookie: 'access_token',
},
signal, // <-- pass signal with options
})
.then((res) => res.json())
.then((data) => {
setPhoto(data.mypost);
})
// catch any rejected fetch promises (including aborted fetches!)
.catch(console.error);