0

我进行 ajax 调用以获取毫秒值,该值在连续调用中会有所不同。

我显示元素中返回的值。

然后我想取该值并将其用作 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 的连续调用,使用不同的值继续重置 timeInterval?

4

2 回答 2

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);
    }
   });
  }
于 2013-08-29T21:29:20.847 回答
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:)中的代码

于 2013-08-29T21:30:19.147 回答