【发布时间】:2022-01-08 05:45:34
【问题描述】:
我想在我的 React 应用程序中使用 AbortController 取消一个承诺,不幸的是 abort event 未被识别,因此我无法对其做出反应。
我的设置如下所示:
WrapperComponent.tsx: 我在这里创建 AbortController 并将信号传递给我的方法 calculateSomeStuff,该方法返回一个 Promise。 controller 我作为道具传递给我的 Table 组件。
export const WrapperComponent = () => {
const controller = new AbortController();
const signal = abortController.signal;
// This function gets called in my useEffect
// I'm passing signal to the method calculateSomeStuff
const doSomeStuff = (file: any): void => {
calculateSomeStuff(signal, file)
.then((hash) => {
// do some stuff
})
.catch((error) => {
// throw error
});
};
return (<Table controller={controller} />)
}
calculateSomeStuff 方法如下所示:
export const calculateSomeStuff = async (signal, file): Promise<any> => {
if (signal.aborted) {
console.log('signal.aborted', signal.aborted);
return Promise.reject(new DOMException('Aborted', 'AbortError'));
}
for (let i = 0; i <= 10; i++) {
// do some stuff
}
const secret = 'ojefbgwovwevwrf';
return new Promise((resolve, reject) => {
console.log('Promise Started');
resolve(secret);
signal.addEventListener('abort', () => {
console.log('Aborted');
reject(new DOMException('Aborted', 'AbortError'));
});
});
};
在我的 Table 组件中,我像这样调用 abort() 方法:
export const Table = ({controller}) => {
const handleAbort = ( fileName: string) => {
controller.abort();
};
return (
<Button
onClick={() => handleAbort()}
/>
);
}
我在这里做错了什么?我的 console.logs 不可见,并且在调用 handleAbort 处理程序后,signal 永远不会设置为 true。
【问题讨论】:
-
doSomeStuff在哪里调用?您确定在设置中止信号之前没有调用它吗? -
该承诺将立即解决。一旦解决了,拒绝它不会有任何作用。这里的异步任务是什么?
-
@sma doSomeStuff 方法在我的 useEffect 挂钩中被调用。我不得不在这里简化代码:(
-
@parktomatomi 在 for 循环内 --> await hashChunk(chunk, hasher);叫做。计算出的值将被添加到定义在 for 循环下方的散列常量中。对不起,我不得不简化很多代码:(
-
我之所以问,是因为“hashChunk”听起来像是一种 CPU 密集型方法,您可以在其中循环一些数据并计算哈希值。如果你不在那个 Promise 构造函数中做你的工作,或者你根本不使用
await、Worker或其他方式释放线程,它实际上不会是异步的。它只会完成工作并返回一个已经解决的承诺。
标签: javascript reactjs async-await promise cancellation