2016-06-10 74 views
1

我正在运行一个函数,它每秒钟检查一次远程脚本并更新进度条。我与setInterval是新的,并且在完成它后停止循环时遇到问题。jQuery setInterval问题

我在几个不同的地方添加了0​​后期功能和clearInterval(interval); - 基本上就像遮住了我的眼睛,把尾巴固定在驴子上 - 并没有成功。 data已达到100,我将在哪里设置clearInterval停止循环?

function getProgress(hash) { 
    setInterval(function() { 
    $.ajax({ 
     type: 'GET', 
     url: 'http://domain.com/script.php?hash=' + hash, 
     cache: false, 
     dataType: 'json', 
     success: function(data) { 
      if (data < 100) { 
      getProgress(); 
      } else { 
      $('#progress-bar').hide(); 
      } 
     }, 
    }); 
    }, 1000); 
} 
+1

请参阅接受的答案:http://stackoverflow.com/questions/109086/stop-setinterval-call-in-javascript – user212514

+2

请发表您如何使用'VAR interval'和'clearInterval' – choz

+0

既然你'使用'setInterval'你的函数将被调用,不需要用'getProgress()'手动调用它' – user3

回答

1

这是假设您无法停止以前的时间间隔的答案。您每次拨打data < 100时都会拨打getProgress方法。其中调用另一个setInterval方法,并为该间隔重新创建一个新的id

比方说,在循环中调用一个以上的时间getProgress方法,如果你这样做,

var intervalId; 
function getProgress(hash) { 
    intervalId = setInterval(function() {..}, 1000); 
} 

而且要停止的间隔接下来的时间,你会打电话clearInterval(intervalId)。这是非常错误。您有超过一个间隔,而您恰好停止了最后一个,而前一个仍在运行,直到data < 100为假

我建议来存储您的间隔IDS在一个阵列,如..

var intervalIds = []; 
function getProgress(hash) { 
    intervalId = setInterval(function() {..}, 1000); 
    intervalIds.push(intervalId); 
} 

如果你想在下一次停止区间,你可以不喜欢它..

for (var idx in intervalIds) { 
    clearInterval(intervalIds[idx]); 
} 

但是,这只是停止所有间隔的一种方法。我在这里想说的是你的代码很难看。如果您使用setInterval方法的原因是等待1000 ms检索另一个数据,那么setTimeout就可以完成这项工作。这里有一个示例使用它并将参数传回。

function getProgress(hash){ 
    $.ajax({ 
     type: 'GET', 
     url: 'http://domain.com/script.php?hash=' + hash, 
     cache: false, 
     dataType: 'json', 
     success: function(data) { 
      if (data < 100) { 
      setTimeout(function() { 
       getProgress(hash); 
      }, 1000); 
      } else { 
      $('#progress-bar').hide(); 
      } 
     }, 
    }); 
} 
+1

完美!非常感谢你的解释。我用我以前的代码尝试过'setTimeout',并且无法让它工作,所以我将它改为'setInterval'。哎呦! :) – timgavin

0

我假设你的代码是在隐藏进度条时完成的。您需要将Interval设置为某个可用于清除它的变量。

function getProgress(hash) { 
    var someVariable = setInterval(function() { 
    $.ajax({ 
     type: 'GET', 
     url: 'http://domain.com/script.php?hash=' + hash, 
     cache: false, 
     dataType: 'json', 
     success: function(data) { 
      if (data < 100) { 
      getProgress(); 
      } else { 
      $('#progress-bar').hide(); 
      clearInterval(someVariable); 
      } 
     }, 
    }); 
    }, 1000); 
} 
0

很好的例子: http://www.w3schools.com/jsref/tryit.asp?filename=tryjsref_win_clearinterval

var myVar = setInterval(function(){ myTimer() }, 1000); 

function myTimer() { 
var d = new Date(); 
var t = d.toLocaleTimeString(); 
document.getElementById("demo").innerHTML = t; 
} 

function myStopFunction() { 
clearInterval(myVar); 
} 

,当你调用的setInterval你需要设置返回值的变量。 然后您可以使用此参数调用clearInterval并停止。