2

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

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

4

4 回答 4

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();
            }
        }
    });

}

请注意我是如何删除setIntervalAjax 代码并将其包装在一个函数中的。当successAjax 查询成功完成时,回调将被调用,并为您提供响应。一旦我们评估了响应,我们可以再次运行该doAjax函数以再次运行查询。

于 2013-09-17T08:10:58.647 回答
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");
}
于 2013-09-17T08:11:09.393 回答
0

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

相反,您可以做的是将区间内部代码包装在 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);
于 2013-09-17T08:04:32.987 回答
0

在您的代码中,您测试不等于“RED”。

if(sample != 'RED'){ . . .

那部分循环停止间隔

如果它等于红色

}else{

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

你到底想达到什么目的?

于 2013-09-17T08:06:41.997 回答