当我使用 setInterval
和 ajax 从数据库中检索数据时,我遇到了这个问题,如果我从数据库中检索的数据等于 saveHere,那么它将再次循环,直到它与变量 save 不匹配这里,它会冻结浏览器,直到我检索的数据不等于 saveHere。
下面是一个示例:
var saveHere = 'RED';
var interval = setInterval(function() {
var sample = $.ajax({
type: 'GET',
url: 'database.php',
data : data
}).responseText;
if (sample != 'RED') {
clearInterval(interval);
saveHere = sample;
}
else {
console.log('load again');
}
},1000);
我真的需要建议。提前谢谢你。对不起语法。
$.ajax
是异步的,需要您使用回调来获取响应文本。
查看文档 http://api.jquery.com/jQuery.ajax/
您要做的是添加一个success
参数。像这样:
var saveHere = 'RED';
doAjax();
function doAjax() {
$.ajax({
type: 'GET',
url: 'database.php',
data: data,
success: function (sample) {
if (sample != 'RED') {
saveHere = sample;
} else {
console.log('load again');
doAjax();
}
}
});
}
请注意,我删除了setInterval
,而是将 Ajax 代码包装在一个函数中。当 Ajax 查询成功完成时,将调用 success
回调,并为您提供响应。评估响应后,我们可以再次运行 doAjax
函数以再次运行查询。
在不知道确切的场景或您希望实现的目标的情况下,我会说您进行 AJAX 调用的方式非常危险,因为它有可能每秒不断发出请求,无论服务器是否有机会响应。
我很想一次只提出一个请求,例如:
var saveHere = 'RED';
makeAjaxCall();
function makeAjaxCall() {
var url = 'database.php';
var data = {};
$.get(url, data, function(response_text){
if (response_text != 'RED')
{
saveHere = response_text;
// do whatever else you need...
}
else
{
// make another call...
console.log('calling again...');
makeAjaxCall();
}
}, "text");
}
您正在清除间隔,这意味着之后不会发生间隔。
相反,您可以做的是将间隔内部代码包装在 if 条件中,如下所示。
var interval = setInterval(function()
{
if(sample != 'RED') {
var sample = $.ajax({
type: 'GET',
url: 'database.php',
data : data
}).responseText;
saveHere = sample;
}
else
{
console.log('load again');
}
},1000);
在你的代码中,你测试不等于"RED"。
if(sample != 'RED'){ . . .
循环的那部分停止间隔
如果它不等于红色
}else{
它只是简单地记录"再次加载"而不清除间隔
你到底想实现什么?