当我使用setInterval
和ajax从数据库中检索数据时,我遇到此问题,如果我从数据库中检索的数据等于saveHere,那么它将再次循环,直到它与变量saveHere不匹配,它冻结浏览器,直到我检索的数据不等于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);
我真的需要建议。先感谢您。对不起语法。
答案 0 :(得分:7)
$.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
函数来再次运行查询。
答案 1 :(得分:2)
在不知道具体情况或您希望实现的目标的情况下,我说您关于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");
}
答案 2 :(得分:0)
您正在清除间隔,这意味着之后不会发生间隔。
相反,如果条件如下,则可以将内部区间内部代码包装在内。
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);
答案 3 :(得分:0)
在您的代码中,您测试不等于'RED'。
if(sample != 'RED'){ . . .
循环的那部分会停止间隔
如果不等于红色
}else{
简单记录'再次加载',不用清除间隔
你到底想要达到什么目的?