【发布时间】:2023-01-30 04:45:19
【问题描述】:
我在顶层组件(App)创建了一些状态,但是似乎当这个状态被更新时,更新的状态并没有被useEffect()中定义的异步函数读取(它仍然使用以前的值),更多细节以下:
我试图在 useEffect() 中定义的异步函数 toggleProcessing 中检索 const processing 的状态,以便当 processing 变为 false 时,异步函数从 while 循环中退出。但是,似乎当processing更新为false时,while循环仍然继续执行。
行为应该如下:按下“开始处理”按钮应该每两秒控制台记录一次“正在处理...”,当再次按下同一个按钮(现在标记为“停止处理”)时,“停止处理”应该被控制台记录。但是,在实践中,“停止处理”永远不会记录在控制台中,而“处理中”会永远持续记录。
下面是代码:
import React, { useState, useEffect} from 'react'
const App = () => {
const [processing, setProcessing] = useState(false)
const sleep = (ms) => {
return new Promise(resolve => setTimeout(resolve, ms))
}
useEffect(() => {
const toggleProcessing = async () => {
while (processing) {
console.log('Processing...')
await sleep(2000);
}
console.log('Stopping Processing')
}
if (processing) {
toggleProcessing() // async function
}
}, [processing])
return (
<>
<button onClick={() => setProcessing(current => !current)}>{processing ? 'Stop Processing' : 'Begin Processing'}</button>
</>
)
}
export default App;
它实际上归结为能够在异步函数中读取 processing 的更新状态,但尽管阅读了类似的帖子,但我还没有找到一种方法来做到这一点。
先感谢您!
【问题讨论】:
标签: javascript reactjs react-hooks