如何解决重置挂钩中的1分钟计数器无法正常工作
我正在创建1分钟计数器,但它正在工作,但是当我单击“重置”按钮以重新启动同一计数器时,出现了奇怪的行为。
这是代码
@client.event
async def on_message(message):
bot_testing = client.get_channel(0000000000)
user_input = message.content
new_message = True
while new_message:
if user_input.lower() == "quit": # type quit to stop the program
print("Program Terminated")
break
results = model.predict([bag_of_words(user_input,words)])[0]
results_index = numpy.argmax(results) # returns the greatest value's index
tag = labels[results_index]
print(results)
print(tag)
if results[results_index] > 0.9: # accuracy threshold for a database reply
for tg in data["replyData"]:
if tg['tag'] == tag:
responses = tg['responses']
await bot_testing.send(random.choice(responses))
new_message = False
else:
await bot_testing.send("I'm not sure I understand. Please try again or ask a different question!")
new_message = False
client.run('some-bot-code')
有人可以帮助我改善它吗?谢谢
解决方法
请考虑让useEffect
带有一个空的依赖项数组和一个间隔而不是超时。然后,在超时回调中,如果counter
大于0,则将其减1:
const App = () => {
const [counter,setCounter] = React.useState(60);
React.useEffect(() => {
setInterval(() => {
// Must use callback form here; outer `counter` is in stale closure
setCounter(counter => counter === 0 ? counter : counter - 1);
},1000);
},[]);
const handleReset = () => {
setCounter(60);
}
return (
<div className="App">
<h1>Counter</h1>
<p>{counter}</p>
<button onClick={handleReset}>Reset</button>
</div>
);
}
ReactDOM.render(<App />,document.querySelector('.react'));
<script crossorigin src="https://unpkg.com/react@16/umd/react.development.js"></script>
<script crossorigin src="https://unpkg.com/react-dom@16/umd/react-dom.development.js"></script>
<div class="react"></div>
您当前使用[counter]
依赖项数组的实现意味着每次counter
更改时都会设置一个新的递归超时,这是不希望的;您将同时运行多个递归超时。
如果我理解正确的话,问题在于每次更新都会创建一个新的setTimeout,并且所有创建的超时会同时更新计数器。代替使用setTimeout,请尝试使用setInterval,您可以在钩子生命周期结束前对其进行清理。
useEffect(() => {
let interval = setInterval(
() => setCounter(counter > 0 ? counter - 1 : counter),1000
);
return () => clearInterval(interval);
},[counter]);
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。