【问题标题】:Why setInterval and clearInterval is not working in JS?为什么 setInterval 和 clearInterval 在 JS 中不起作用?
【发布时间】:2021-11-16 21:51:00
【问题描述】:

我是 JS 新手。

我有两张像下面这样的卡片,

<div class = "card" id ="c1">
     <div class = "content"> </div>
</div>

<div class = "card" id ="c2">
     <div class = "content"> </div>
</div>

卡片 1 中的 div content 应该像 Date.now() 一样显示动态值,而卡片 2 中的 content 应该显示静态值。

JS:

function cardData(card) {
    myCard(card);
}

function allCardData() {
    var cards = document.getElementsByClassName("card");
    Array.prototype.forEach.call(cards, (card) => {
      cardData(card);
    });
  }

function mockData(card) {
  
   var setInt;

    function caseOne(card, callBackOne) {
      callBackOne(card);
    }

    function caseTwo(card, callBackTwo) {
      callBackTwo(card);
    }
    
    // SetInterval function
    function callBackOne(card) {
      setInt = setInterval(function () {
        var currentDate = Date.now();
        var val = String(currentDate).substr(8, 2);
      }, 1000);
    }
    //clearInterval
    function callBackTwo(card) {
      clearInterval(setInt);
    }
   
   
  switch(card) 
    {
     case "c1":
     return {
       target: card,
       value: caseOne(card, callBackOne)
     }
     case "c2":
     return {
       target: card,
       value: caseTwo(card, callBackTwo)
     }
     }
     }
     
   function Callback(value, callback) {
    callback(value);
    }
 
  function myCard(card) {
    Callback(mockData(card), function (data) {
      console.log(data);
      var target = document.getElementById(data.target);
      var content = target.getElementsByClassName('content')[0];
      content.innerHTML = data.value;
    });
  }
 
 
  //Onload function
 window.onload = function () {
 allCardData();
 };

我需要 card1 中的每 2 秒动态数据card2 中的 static data Which clears the dynamic value

但是,它不起作用。

因为,回调函数需要return,当我将函数mockData传递给回调时。它没有按预期工作。

有人可以帮我to start the dynamic data in card1 and clear the data in card2.?

非常感谢。

【问题讨论】:

  • 你试过调试吗?您可以随时使用断点停止执行代码,只需查看变量值即可。或者将console.log(card) 放入mockData()caseOne()caseTwo() 中,这样您就可以看到一切是否按照您的预期执行。
  • @Peter Krebs。是的,我尝试调试。 console.log(data) 为案例 1 提供静态值 3,对于案例 2,该值未定义。
  • 那么console.log(card) 呢?到处都是正确的吗? clearInterval(setInt) 返回值未定义,无需将其保存在变量中。见clearInterval docs
  • console.log(data) in mockData() 提供卡 ID“c1”和“c2”。
  • 从 clearInterval 中删除了 return。但是,它没有用。请你帮助我好吗? @PeterKrebs

标签: javascript html


【解决方案1】:

这就是代码的作用:

  • window.onload 调用allCardData()
  • allCardData() 调用cardData() 为找到的每张卡片与卡片的ID
  • cardData() 在中间步骤调用 myCard()
  • myCard()Callback 打电话给mockData() 卡片
  • mockData() 调用 caseOne() 获取卡 c1 和 caseTwo() 获取卡 c2
  • caseOne() 设置 2 秒间隔
  • caseTwo() 取消间隔

调用caseOne()caseTwo() 之间没有时间。他们被互相调用,中间没有时间。这意味着定时器在初始化后立即被取消。 2 秒计时器没有时间做任何事情。

caseTwo() 更改为仅在特定条件过去后清除计时器的建议解决方案。否则间隔将永远不会开始。
您可能想google一下async/await,您可能需要更改其他部分的代码:

  async function caseTwo(card) {
    // asynchronously wait, stopping this function until the value is known
    var value = await getValueTwoFromSomewhere();
    
    clearInterval(setInt);
    return value;
  }

否则代码将需要重写为不同的东西。
也许您想重新考虑您的解决方案并将其作为另一个问题再次发布。

【讨论】:

  • 非常感谢! .我需要知道,setInterval 和 clearInterval 如何在函数mockData 中的开关盒中工作。如何从 callBack() 中检索 mockdata?你能给我一些建议吗?
  • 你的代码试图是线性的,但你想做的是异步的。回调无法获取该值,因为该值尚不知道。您可以更改您的代码,以便 caseOne()caseTwo() 在值已知时调用回调。
  • 谢谢!但是,我没有得到你。能否请您简要解释一下。
  • 我的意思是给caseOne()caseTwo() 也提供回调函数作为参数并在那里调用回调函数。这样你就可以让回调设置值并在正确的时间停止计时器。
  • caseOne()caseTwo() 已经在 mockData() 中,我们在回调中传递,例如 Callback(mockData(card), function (data) { }); 我是否需要在 mockdata() 中添加 caseOnecaseTwo()
猜你喜欢
  • 2021-05-18
  • 2017-09-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-07-15
  • 1970-01-01
相关资源
最近更新 更多