【问题标题】:setInterval and AjaxsetInterval 和 Ajax
【发布时间】:2013-09-17 07:59:37
【问题描述】:

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

我真的需要建议。先感谢您。语法抱歉。

【问题讨论】:

  • 你到底想做什么?可能有一种更优雅的方式来实现你的最终目标:)
  • 我需要建议,因为此代码会使浏览器冻结,我什至无法单击按钮,直到它发现我正在检索的数据不等于 saveHere。感谢您的回复。

标签: javascript jquery ajax


【解决方案1】:

$.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 函数以再次运行查询。

【讨论】:

  • 如果没有 setTimeout 回调到 doAjax 以将请求间隔一点,这可能会在服务器上变得有点苛刻。
  • 感谢您的建议先生,我认为我的程序中的问题是它使用了 setInterval 并冻结了浏览器。
  • 关于$.ajax 的异步特性的好点...您不需要最初调用doAjax() 吗?
  • 哈哈,我也做了同样的事情! ;D
【解决方案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");
}

【讨论】:

  • 感谢@chris 先生的回复,问题是当我使用该代码时,它会冻结浏览器。
  • 您指的是我建议@reyes 的代码示例吗?我修复了上面的代码,这次实际调用了函数>__O
  • 不,先生,对不起,我的意思是我的代码。但我想问一下这段代码是否可以让浏览器冻结。
  • 不,不应该,因为它没有使用异步$.ajax调用,它应该在后台静默运行,直到response_text等于'RED'...跨度>
  • @Chris 先生,我稍后再试,我忘了带我的笔记本电脑,它用于我的论文,非常有帮助,谢谢。最后一个问题,当它再次循环时,它会冻结浏览器。
【解决方案3】:

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

相反,您可以将区间内部代码包装在 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);

【讨论】:

  • 我使用 clearInterval 这样当它完成从数据库中检索数据时它不会冻结。
【解决方案4】:

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

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

循环的那部分停止间隔

如果它等于红色

}else{

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

你到底想达到什么目的?

【讨论】:

  • 这就是OP描述它的方式:“等于saveHere然后它会再次循环”
  • 是的先生,因为我正在做一个棋盘游戏,当我完成移动时,我会去这个代码查找其他玩家是否移动,抱歉没有提及。谢谢回复
猜你喜欢
  • 2011-07-08
  • 2011-08-24
  • 2014-02-01
  • 1970-01-01
  • 1970-01-01
  • 2012-07-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多