首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何允许函数#2只在函数#1完成后才运行,而不触发函数#2?

如何允许函数#2只在函数#1完成后才运行,而不触发函数#2?
EN

Stack Overflow用户
提问于 2022-01-14 00:34:22
回答 2查看 43关注 0票数 0

我有两个函数,onTouchStart和onTouchEnd,其中onTouchEnd使用onTouchStart设置的状态变量。我担心onTouchEnd函数可能读取状态变量的错误值,因为onTouchStart可能还没有完成状态设置。主要的问题是,我不希望onTouchEnd在每次onTouchStart完成时都被触发,而是需要onTouchStart在onTouchEnd执行之前将状态存储变量设置为正确的值。

代码语言:javascript
复制
onTouchStart(){
   this.setState({
      randomBool: true   
   }); 
}

onTouchEnd(){
   console.log("randomBool should be true: " + this.state.randomBool);

   //then some stuff here
}
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2022-01-14 00:54:10

您可以使用后面跟着setTimeout的检查

代码语言:javascript
复制
onTouchEnd(){
  if (!this.state.randomBool)
    setTimeout(this.onTouchEnd, 10);

  //then some stuff here
}

如果需要,还可以将参数传递到“递归”调用:setTimeout(() => this.onTouchEnd(v1, v2), 10);

票数 1
EN

Stack Overflow用户

发布于 2022-01-14 01:11:00

为了确定地做到这一点,您需要某种可以同步写入的状态,并且需要一些东西来指示setState已经完成。

(我在这里假设setState以许诺的形式提供了这个指示)。

在下面的片段中,按住鼠标不到一秒,然后再试一次超过一秒钟.

代码语言:javascript
复制
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));
  
}
代码语言:javascript
复制
<div id="touchMe" style="background-color:yellow;">Touch Me</div>

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/70704778

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档