我有两个函数,onTouchStart和onTouchEnd,其中onTouchEnd使用onTouchStart设置的状态变量。我担心onTouchEnd函数可能读取状态变量的错误值,因为onTouchStart可能还没有完成状态设置。主要的问题是,我不希望onTouchEnd在每次onTouchStart完成时都被触发,而是需要onTouchStart在onTouchEnd执行之前将状态存储变量设置为正确的值。
onTouchStart(){
this.setState({
randomBool: true
});
}
onTouchEnd(){
console.log("randomBool should be true: " + this.state.randomBool);
//then some stuff here
}发布于 2022-01-14 00:54:10
您可以使用后面跟着setTimeout的检查
onTouchEnd(){
if (!this.state.randomBool)
setTimeout(this.onTouchEnd, 10);
//then some stuff here
}如果需要,还可以将参数传递到“递归”调用:setTimeout(() => this.onTouchEnd(v1, v2), 10);
发布于 2022-01-14 01:11:00
为了确定地做到这一点,您需要某种可以同步写入的状态,并且需要一些东西来指示setState已经完成。
(我在这里假设setState以许诺的形式提供了这个指示)。
在下面的片段中,按住鼠标不到一秒,然后再试一次超过一秒钟.
document.getElementById("touchMe").addEventListener('mousedown', onTouchStart);
document.getElementById("touchMe").addEventListener('mouseup', onTouchEnd);
let state; // assuming we can only read and write this async...
// ...with this getter and setter
async function setState(object) {
return new Promise(resolve => {
setTimeout(() => {
state = object
resolve()
}, 1000);
})
}
async function getState() {
return new Promise(resolve => {
setTimeout(() => {
resolve(state)
}, 1000);
})
}
// BUT, we can write this synchronously
let settingState = false;
function onTouchStart() {
settingState = true;
setState({ someBool: true }).then(() => {
settingState = false;
})
}
function onTouchEnd() {
if (settingState) {
console.log("giving up, because we're busy writing state");
return;
}
console.log("we can get state now");
getState().then(state => console.log(state));
}<div id="touchMe" style="background-color:yellow;">Touch Me</div>
https://stackoverflow.com/questions/70704778
复制相似问题