每隔x秒从服务器请求数据的最佳方式

时间:2016-03-08 11:06:07

标签: javascript php jquery ajax settimeout

我创建了一个非常简单的例子。我尝试每隔X秒从我的服务器请求一个值,在这种情况下,我只想得到一个随机数,每秒。 这个解决方案有效,但不幸的是,似乎在一段时间后会发生无限循环,从而导致崩溃。一段时间net::ERR_INSUFFICIENT_RESOURCES后我也会得到超过100k的错误。

request_data(1000);

function request_data(intervall) {            
    $.post('ajax.php', {
        cmd: "get_random_number"
    }, function (returned_data, status) {
        if (status === "success") {
            $("#result_output").html(returned_data);
            setInterval(function() {
                request_data(intervall);
            }, intervall);
        }
    });
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<p id="result_output></p>
// ajax.php
<?php
    $cmd  = filter_input(INPUT_POST, "cmd");
    if (isset($cmd) && $cmd == "get_random_number") {
        echo rand(5, 15);
    }

实现这一目标的最佳解决方案是什么?

3 个答案:

答案 0 :(得分:1)

你可以做一个setInterval,然后在里面做一个ajax调用。您可以在$ .ajax中设置的一个参数是超时 - 这样您就可以停止多个ajax调用堆叠并导致问题。

$.ajax({
    url: '',
    type: '',
    data: {},
    timeout: 3000,
    success: function(data){
        // do stuff
    }
});

有关参数的详细信息,请参阅http://api.jquery.com/jQuery.ajax/

答案 1 :(得分:1)

正如Derek指出的那样,这是因为你正在进行2 ^ n次调用,因为setInterval在函数本身内部。

尝试这样做

window.setInterval(1000, request_data);

function request_data() {            
    $.post('ajax.php', {
        cmd: "get_random_number"
    }, function (returned_data, status) {
        if (status === "success") {
            $("#result_output").html(returned_data);
        }
    });
}

答案 2 :(得分:0)

我只需将setInterval替换为setTimeout即可解决此问题。