【发布时间】:2020-06-03 02:43:22
【问题描述】:
我有一个采用 visible bool 属性的 React 组件。 react 执行一个触发长时间运行的 Promise 的函数,当visible 更改时,我需要取消 Promise。然而,试图从外部拒绝 Promise 并不会停止执行。
代码的大致轮廓如下所示:
<ComponentA visible={visible} />
const ComponentA = ({ visible }) => {
const [rejectFn, setRejectFn] = useState(() = () => console.log('test');
useEffect(() => {
if (visible) {
...
} else {
setRejectFn();
}
}, [visible]);
const promiseFn = () => (
new Promise((resolve, reject) => {
// logic
const endCallback = (error) => {
if (error) {
reject(error);
console.log('error', error);
} else {
resolve(...);
}
};
setRejectFn(() = () => endCallback('exit early'));
someOtherFn(..., endCallback); // processing file chunk by chunk
})
);
const onDivClick = () => (
// set some state vars
promiseFn()
.then(() => ...)
.catch(() => ...)
.finally(() => ...);
);
return (
<div onClick=(onDivClick) />
);
}
上述代码将触发rejectFn 并记录"exit early",但Promise 将继续执行直到完成。
【问题讨论】:
-
按照设计承诺保证总是解决(或出错)。您可以通过无操作来模拟取消,但它应该始终按设计解决。
-
您的代码也不会在重新渲染时清理 Promise,这可能会导致重复调用和 Promise 解析。
-
为什么不多说一些关于这个长时间运行的代码?如果是某种计算,则需要在该计算内部检查 Promise 是否已“取消”并停止计算。喜欢
return或throw,不管最快的出路是什么。 -
@Thomas 长时间运行的代码基本上是这样的:stackoverflow.com/a/39112502/4781945
标签: javascript reactjs promise react-hooks es6-promise