如何在本机反应中停止setInterval

how to stop setInterval in react native

我正在 运行 设置一个 setinterval 函数来检查我的本机应用程序中来自 coinbase 的付款,我 运行 每 10 秒后,付款完成后的功能完成后,我清除 setinterval 并导航到主页,但 setinteval 仍然保持 运行ning 我怎么能阻止它?

      useEffect(() => {
        getData();
        myinterval();
      }, []);
    
      const myinterval= () => setInterval(function () {
        checkCharge();
      }, 10000);

      const stopCounter = () => {
        clearInterval(myinterval);
      }

  const checkCharge = async () => {
    try {
      ...SOME_CODE_HERE...
      stopCounter()        
      navigation.navigate("HomeScreen");
          
    } catch (e) {
      console.log(e);
    }
  };

您没有使用 myinterval() 中的 return 来清除 setIntervalsetInterval() returns 一个用于清除间隔的id。当您调用函数 myinterval 时,它正在 returning 该 ID。您需要做的是将该 ID 存储在可用于清除间隔的变量中。

...
function createInterval(){
    return setInterval(checkCharge, 10000);
}

function stopCounter(id){
    clearInterval(id);
}
...
var id = createInterval();
...

function checkCharge(){
    try {
        ...
        stopCounter(id);
        ...
    } catch(e){
        console.error(e);
    }
}

我认为这是因为 myinterval 分配给了一个函数,而不是 setInterval() 函数的实际 return 值。所以尝试改变

const myinterval = () => setInterval(function () {
        checkCharge();
      }, 10000);

const myinterval = setInterval(function () {
        checkCharge();
      }, 10000);

然后用clearInterval(myinterval);

取消myinterval变量

我 运行 几个月前遇到过类似的问题,这个解决方案应该可以完美运行:

const myinterval = setInterval(function () {
      checkCharge();
 }, 10000);

但就我而言,因为我将 setInterval 存储在变量而不是函数中,所以我遇到了一些奇怪的问题,例如 setInterval 可能 运行 三次或保留在 运行ning 甚至在我使用 clearInterval(INTERVAL_NAME); 之后,所以如果您想检查是否已付款,请创建一个按钮,告诉用户在付款后点击,这将是比 运行 setInterval

中的函数安全得多