setInterval和Ajax

当我使用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); 

我真的需要建议。 先感谢您。 对不起语法。

在不知道具体情况或者您想要实现的目标的情况下,我会说您关于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"); } 

$.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代码包装在函数中的。 success回调将在Ajax查询成功完成时调用,并为您提供响应。 一旦我们评估了响应,我们就可以再次运行doAjax函数来再次运行查询。

您正在清除间隔,这意味着之后不会发生间隔。

相反,如果条件如下,你可以做的是将内部区间内码包裹起来。

 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{ 

它简单地记录’再次加载’ 而不清除间隔

你究竟想要实现什么目标?