问题:似乎React.useMemo不直接支持TypeScript的async/await并将返回一个Promise:
//returns a promise:
let myMemoizedResult = React.useMemo(() => myLongAsyncFunction(args), [args])
//also returns a promise:
let myMemoizedResult = React.useMemo(() => (async () => await myLongAsyncFunction(args)), [args])
什么是使用React.useMemo正确等待异步函数结果并记忆结果的方法?我已经在普通的JS中使用了常规的Promise,但在这些情况下仍然遇到了问题。我尝试过memoize-one等其他方法,但问题似乎是由于React函数组件的工作方式而导致“this”上下文发生变化破坏了记忆化,这就是为什么我正在尝试使用React.useMemo的原因。也许我在把一个方形钉子塞进圆孔,如果是这样的话,也很好知道。现在,我可能只会编写自己的记忆函数。编辑:我认为其中一部分是我在使用memoize-one时犯了一个不同的愚蠢错误,但我仍然对这里关于React.memo的答案感兴趣。这里有一个片段-想法是不直接在渲染方法中使用记忆结果,而是将其作为事件驱动方式的参考,即在单击“计算”按钮时。
export const MyComponent: React.FC = () => {
let [arg, setArg] = React.useState('100');
let [result, setResult] = React.useState('Not yet calculated');
//My hang up at the moment is that myExpensiveResultObject is
//Promise<T> rather than T
let myExpensiveResultObject = React.useMemo(
async () => await SomeLongRunningApi(arg),
[arg]
);
const getResult = () => {
setResult(myExpensiveResultObject.interestingProperty);
}
return (
<div>
<p>Get your result:</p>
<input value={arg} onChange={e => setArg(e.target.value)}></input>
<button onClick={getResult}>Calculate</button>
<p>{`Result is ${result}`}</p>
</div>);
}
let myMemoizedResult = await React.useMemo(() => myLongAsyncFunction(args), [args])
? - Gazihan Alankus