setInterval and Ajax



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

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

你到底想实现什么?

最新更新