2013-08-29 90 views
0

我做了一个ajax调用来获得一个毫秒值,这将连续调用不同 。jQuery setTimeout,可变时间参数

我显示元素中返回的值。

然后我想取这个值并将它用作setTimeout中的时间参数 。

当我的函数再次执行时,我想使用返回的新值重置setTimeout 时间参数。

这里是我的,但它只是初步在十秒钟后执行一次:

var timeInterval = 10000; 
setTimeout(function() { 
$.ajax({ 
    type: "POST", 
    url: "NowPlaying.asmx/GetMilliSeconds", 
    data: "{}", 
    contentType: "application/json; charset=utf-8", 
    dataType: "json", 
    success: function(msg) { 
     $('#duration').html(msg.d.MilliSeconds); 
     clearTimeout(timeInterval); 
     timeInterval = msg.d.MilliSeconds; 
    } 
    }); 
    }, timeInterval); 

是否有可能保持基于连续调用GetMilliSeconds不同的值重置一个时间间隔?

回答

1

setTimeout只会触发一次,因为这就是它设计的目的。 (也许你有它setInterval混淆?)

clearTimeout(timeInterval)没有任何意义,原因有二:

  1. 你必须从setTimeout通过它的返回值,而不是一个区间。
  2. 您不需要在发生超时后清除超时,因为每次调用setTimeout时只会触发一次。

这可能是更接近你是瞄准:

var timeInterval = 10000; 
var interval = setInterval(callBack, timeInterval); 

function callBack() { 
    $.ajax({ 
    type: "POST", 
    url: "NowPlaying.asmx/GetMilliSeconds", 
    data: "{}", 
    contentType: "application/json; charset=utf-8", 
    dataType: "json", 
    success: function(msg) { 
     $('#duration').html(msg.d.MilliSeconds); 
     timeInterval = msg.d.MilliSeconds; 

     // Update interval with the new value of timeInterval: 
     clearInterval(interval); 
     interval = setInterval(callBack, timeInterval); 
    } 
    }); 
    } 
+0

ahh,击败我,并且击中所有重要的点。帮你! +1:P – Jordan

+0

谢谢。在第一次执行clearInterval之后,第二次调用callBack。我在想,是不是第一个叫回来的电话会退出?是否有某种堆叠在某个地方?我只是想知道,如果每个callBack调用都在等待退出,会消耗什么资源。我不太了解jQuery和javaScript。这个递归部分让我感到困惑。 – user847335

+0

@ user847335由于ajax是异步的,它会在不同的线程上执行正常代码。这意味着第一次通话在第二次通话之前退出。请注意,如果timeInterval太短,'callBack'可能会在被清除之前再次被调用。 – Jordan

0

你应该有这一切的功能,递归调用它在你的成功块。像这样:

function() NowPlaying (timeInterval) { 
    //Your code... 

    success: function(msg) { 
     $('#duration').html(msg.d.MilliSeconds); 
     clearTimeout(IntervalHandler); 
     NowPlaying(msg.d.MilliSeconds); 
    } 
} 

您当然需要一个基本案例来知道何时退出递归循环。

此外,您使用clearTimeout的方式存在问题。你在你的时间间隔中调用它,在你的代码中是10000,但这不是你的setTimeout的处理程序。因为您使用的是setTimeout,所以您不需要清除处理程序,因为它只能通过clearTimeout访问setTimeout的代码:)

+0

谢谢,我在标记答案之后才看到您的评论。是的,基本案例在这个递归中对我来说很有意义。上面的Krall的帖子中的答案是否证明了这种担忧?另外,我没有意识到你需要从setInterval中获取返回值来清除它。非常感谢你们的帮助。 – user847335

+0

@ user847335不用担心,Krall的帖子措辞更加贴切,并且符合所有要点,除了接受它之外,您还应该投票支持他。我不是100%肯定他有一个基本情况,但是,在'callback()'的开始部分引入这个块可能是一个好主意:'if(iWantOut){clearInterval(interval); } else {//处理所有其他事情}'其中'iWantOut'是一些条件,当你希望代码停止时是true – Jordan