这是我目前的代码:
$(document).ready( function() {
// set variables
var delay = 3000;
setInterval( function() {
// perform AJAX call
var req = $.ajax({
url: "view/jquery/jq.refresh.php",
dataType: "json"
});
// process data from json
req.done( function(data) {
$("#now_playing").html(data.song);
$("#queue_list").html(data.queue);
delay = data.time;
});
}, delay);
});
......而且它没有按计划运作。
我们的想法是使用AJAX从数据库中检索可变延迟(歌曲的长度)。并将该延迟(歌曲的长度)放入setInterval
,这样脚本将以可变间隔循环,具体取决于正在播放的歌曲的长度,希望减少服务器/数据库的负载。
我确定从数据库中检索到正确的延迟值,因为添加console.log(date.time);
会显示歌曲的长度。
我有一个理论为什么我的代码无法工作,setInterval
在实际处理代码之前读取其ms值,因此它始终设置为3000
。
另一个理论是delay = data.time
没有改变delay
值,因为它是在脚本开头设置的全局变量。
那么我有什么选择来实现可变间隔而不会崩溃/冻结浏览器?
答案 0 :(得分:1)
因为在初始调用setInterval
时设置了间隔。修改delay
的值将无效。
您应该在此方案中使用setTimeout
。
$(document).ready(function() {
// set variables
var delay = 3000;
//Define a function
function getData() {
// perform AJAX call
var req = $.ajax({
url: "view/jquery/jq.refresh.php",
dataType: "json"
});
// process data from json
req.done(function(data) {
$("#now_playing").html(data.song);
$("#queue_list").html(data.queue);
delay = data.time;
//Schedule the subsequent execution
setTimeout(getData, data.time);
});
}
//Schedule to execute after 3 seconds on page load
setTimeout(getData, delay);
});
答案 1 :(得分:0)
setInterval在实际处理代码之前读取其ms值,因此它始终设置为3000
是。您只需拨打setInterval
一次,而delay
设置为3000.在此之后更改delay
的值将不会影响已安排的时间间隔。
如果您想要一个可变间隔,则无法使用setInterval
。使用setTimeout
,让每个回调将其后续回调排入队列。
function pollNext() {
// perform AJAX call
var req = $.ajax({
url: "view/jquery/jq.refresh.php",
dataType: "json"
});
// process data from json
req.done( function(data) {
$("#now_playing").html(data.song);
$("#queue_list").html(data.queue);
setTimeout(pollNext, data.time);
});
}
pollNext(); // Prime the initial invocation
答案 2 :(得分:0)
delay
调用setInterval()
只读一次 - 声明间隔时。您在实例化后尝试更改delay
变量将无效。
替代方法是链接setTimeout()
调用,然后您可以更改下一个超时的延迟。试试这个:
function createTimeout(delay) {
setTimeout(function() {
$.ajax({
url: "view/jquery/jq.refresh.php",
dataType: "json"
}).done(function(data) {
$("#now_playing").html(data.song);
$("#queue_list").html(data.queue);
createTimeout(data.time);
});
}, delay);
}
createTimeout(3000);