[英]Cleanup function fails the first time using AbortController
我使用AbortController
在卸载 React 生命周期中取消fetch
promise。 出于某种原因,清理在元素 unmounts 的第一次时不起作用。
useEffect(() => {
const controller = new AbortController();
const signal = controller.signal;
fetch(`https://pokeapi.co/api/v2/pokemon/${name}`, { signal })
.then(sleeper(1)) // Create some latency
.then(res => res.json())
.then(response => {
setData(response);
})
.catch(error => {
setData(error);
});
return () => {
controller.abort();
};
}, [name]);
请按照以下步骤操作:
Show/hide pokemon
按钮 TWICE 以强制中止子Pokemon
反应元素。Can't perform a React state update on an unmounted component
Show/hide pokemon
按钮 TWICE 以强制中止子Pokemon
反应元素。注意:当
abort()
被调用时,fetch()
promise 会拒绝一个名为AbortError
的DOMException
。
当组件卸载并调用abort
时, fetch
会因错误而拒绝。 错误被捕获,并且此代码正在尝试使用错误设置 state。 省略此错误 state 更新会删除反应错误。
useEffect(() => {
const controller = new AbortController();
const signal = controller.signal;
fetch(`https://pokeapi.co/api/v2/pokemon/${name}`, { signal })
.then(sleeper(1)) // Create some latency
.then(res => res.json())
.then(response => {
setData(response);
})
.catch(error => {
setData(error); // <-- this is being called after component unmounts!
});
return () => {
controller.abort();
};
}, [name]);
我也愿意打赌每次都会发生错误,但反应只是输出第一个错误并让 output 静音以处理后续错误。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.