我正在尝试为可重复的查询添加延迟。
我发现.delay不是这里使用的。相反,我应该使用setInterval或setTimeout。我试过了两个,没有任何运气。
这是我的代码:
<?php
include("includes/dbconf.php");
$strSQL = mysql_query("SELECT workerID FROM workers ORDER BY workerID ASC");
while($row = mysql_fetch_assoc($strSQL)) {
?>
<script id="source" language="javascript" type="text/javascript">
$(setInterval(function ()
{
$.ajax({
cache: false,
url: 'ajax2.php',
data: "workerID=<?=$row['workerID'];?>",
dataType: 'json',
success: function(data)
{
var id = data[0]; //get id
var vname = data[1]; //get name
//--------------------------------------------------------------------
// 3) Update html content
//--------------------------------------------------------------------
$('#output').html("<b>id: </b>"+id+"<b> name: </b>"+vname);
}
});
}),800);
</script>
<?php
}
?>
<div id="output"></div>
代码工作正常,它按照要求输出结果。它只是没有延迟的负载。时间和/或间隔似乎不起作用。
有人知道我做错了吗?
答案 0 :(得分:25)
我从来没有理解为什么人们总是在间隔时间添加他们的AJAX请求而不是让成功的AJAX调用只是自己调用,同时冒着通过多个请求严重加载服务器的风险,而不是仅仅在你成功的时候再拨打一个电话回来。
有鉴于此,我喜欢编写解决方案,其中AJAX调用只是在完成时调用自己,如:
// set your delay here, 2 seconds as an example...
var my_delay = 2000;
// call your ajax function when the document is ready...
$(function() {
callAjax();
});
// function that processes your ajax calls...
function callAjax() {
$.ajax({
// ajax parameters here...
// ...
success: function() {
setTimeout(callAjax, my_delay);
}
});
}
我希望这是有道理的! :)
在再次审核之后,我注意到原始问题中的PHP代码中也存在一个问题需要澄清和解决。
虽然上面的脚本在创建AJAX调用之间的延迟方面效果很好,但是当添加到原始帖子中的PHP代码时,脚本只会echo
'出现与行数一样多的行数。 SQL查询选择,创建具有相同名称的多个函数,并可能同时进行所有AJAX调用......根本不是很酷......
考虑到这一点,我提出了以下附加解决方案 - 使用PHP脚本创建一个array
,一次可以由JavaScript一个元素消化以实现所需的结果。首先,PHP构建JavaScript数组字符串......
<?php
include("includes/configuratie.php");
$strSQL = mysql_query("SELECT workerID FROM tWorkers ORDER BY workerID ASC");
// build the array for the JavaScript, needs to be a string...
$javascript_array = '[';
$delimiter = '';
while($row = mysql_fetch_assoc($strSQL))
{
$javascript_array .= $delimiter . '"'. $row['workerID'] .'"'; // with quotes
$delimiter = ',';
}
$javascript_array .= ']';
// should create an array string, something like:
// ["1","2","3"]
?>
接下来,用JavaScript来消化和处理我们刚创建的数组......
// set your delay here, 2 seconds as an example...
var my_delay = 2000;
// add your JavaScript array here too...
var my_row_ids = <?php echo $javascript_array; ?>;
// call your ajax function when the document is ready...
$(function() {
callAjax();
});
// function that processes your ajax calls...
function callAjax() {
// check to see if there are id's remaining...
if (my_row_ids.length > 0)
{
// get the next id, and remove it from the array...
var next_id = my_row_ids[0];
my_row_ids.shift();
$.ajax({
cache : false,
url : 'ajax2.php',
data : "workerID=" + next_id, // next ID here!
dataType : 'json',
success : function(data) {
// do necessary things here...
// call your AJAX function again, with delay...
setTimeout(callAjax, my_delay);
}
});
}
}
答案 1 :(得分:1)
注意:Chris Kempen的答案(上图)更好。请使用那个。 他在AJAX例程中使用this technique。有关使用setTimeout优于setInterval的原因,请参阅this answer。
//Global var
is_expired = 0;
$(function (){
var timer = setInterval(doAjax, 800);
//At some point in future, you may wish to stop this repeating command, thus:
if (is_expired > 0) {
clearInterval(timer);
}
}); //END document.ready
function doAjax() {
$.ajax({
cache: false,
url: 'ajax2.php',
data: "workerID=<?=$row['workerID'];?>",
dataType: 'json',
success: function(data) {
var id = data[0]; //get id
var vname = data[1]; //get name
//--------------------------------------------------------------------
// 3) Update html content
//--------------------------------------------------------------------
$('#output').html("<b>id: </b>"+id+"<b> name: </b>"+vname);
}
}); //END ajax code block
} //END fn doAjax()
答案 2 :(得分:0)
我设计了a a wrapper method,它添加了默认$.ajax
方法的自定义延迟 on-top 。这是一种在整个应用程序中延迟(在所有 jQuery ajax调用上)延迟的方法。
模拟真实的随机延迟非常方便。
(function(){
$._ajaxDelayBk = $.ajax; // save reference to the "real" ajax method
// override the method with a wrapper
$.ajax = function(){
var def = new $.Deferred(),
delay = typeof $.ajax.delay == 'undefined' ? 500 : $.ajax.delay,
delayTimeout,
args = arguments[0];
// set simulated delay (random) duration
delayTimeout = setTimeout(function(){
$._ajaxDelayBk(args)
.always(def.resolve)
.done(def.resolve)
.fail(def.reject)
}, delay);
def.abort = function(){
clearTimeout(delayTimeout);
};
return def;
}
})();
// optional: set a random delay to all `ajax` calls (between 1s-5s)
$.ajax.delay = Math.floor(Math.random() * 5000) + 1000;
var myAjax = $.ajax({url:'http://whatever.com/API/1', timeout:5000})
.done(function(){ console.log('done', arguments) })
.fail(function(){ console.log('fail', arguments) })
.always(function(){ console.log('always', arguments) })
// Can abort the ajax call
// myAjax.abort();