鍍金池/ 問答/HTML/ 遞歸和setTimeout

遞歸和setTimeout

問題描述

創(chuàng)建了一個遞歸函數(shù)A每隔5秒調(diào)用自己,有一個函數(shù)B是websocket每隔一段時間會推送一次消息,函數(shù)A在B的回調(diào)中也就是當(dāng)B推送的時候,會執(zhí)行A但是第一次剛執(zhí)行還沒過5秒B函數(shù)又推送了,所以A函數(shù)又會執(zhí)行此時遞歸疊加了。

問題出現(xiàn)的環(huán)境背景及自己嘗試過哪些方法

相關(guān)代碼

// 請把代碼文本粘貼到下方(請勿用圖片代替代碼)

  (function(arr) {
    var i = 0,
    len = arr.length;
    clearTimeout(self.setVar);
    (function setColor() {
      self.setVar = setTimeout(function() {
        
        if (i < len-1) {
          if (i > 0) {
            arr[i - 1].borderWidth = 0;
          }
          arr[i].borderColor = "45,215,16";
          arr[i].borderWidth = 2;
          console.log(i,'----')
          var aaa = window.localStorage.getItem('arrDatas');
          console.log(aaa,'=========+++++++');
          i = i + 1;
          // clearTimeout(self.setVar);
          setColor();
          // clearTimeout(self.setVar);
        } else if(i===len-1){
          var bbb = window.localStorage.getItem('arrDatas');
          console.log(bbb,'最后一個機房==');
          arr[i].borderColor = "45,215,16";
          arr[i].borderWidth = 2;
          arr[i-1].borderWidth = 0;
          i = i+1;
          
          setColor();
        }else{
          arr[i-1].borderWidth = 0;
          i = 0;
          // clearTimeout(self.setVar);
          setColor();
        }
      }, 5000);
     
    })(i);
  })(nodeExample);

你期待的結(jié)果是什么?實際看到的錯誤信息又是什么?

題目描述

我試著清除計時器可是不管用

題目來源及自己的思路

相關(guān)代碼

// 請把代碼文本粘貼到下方(請勿用圖片代替代碼)

你期待的結(jié)果是什么?實際看到的錯誤信息又是什么?

問題描述

問題出現(xiàn)的環(huán)境背景及自己嘗試過哪些方法

相關(guān)代碼

// 請把代碼文本粘貼到下方(請勿用圖片代替代碼)

你期待的結(jié)果是什么?實際看到的錯誤信息又是什么?

回答
編輯回答
深記你

你清除的位置是不是有點遠

 clearTimeout(self.setVar);
    (function setColor() {
      self.setVar = setTimeout(function() {

改成這樣就不會導(dǎo)致有多個setTimeout

(function setColor() {
  clearTimeout(self.setVar);
  self.setVar = setTimeout(function() {
2017年8月21日 11:58