【问题标题】:Best way to request data from server every x seconds每 x 秒从服务器请求数据的最佳方式
【发布时间】:2016-03-08 11:06:06
【问题描述】:

我创建了一个非常简单的示例。我尝试每隔 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);
    }

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

【问题讨论】:

  • 如果你只是得到一个随机数,为什么不在客户端这样做以节省带宽和服务器处理时间呢?如果这是您针对这个问题的逻辑的简化版本,请查看使用 websockets。
  • 肯定会是无限的,因为你使用的是 setInterval 而不是 setTimeout
  • 将setInterval 更改为setTimeout。您正在拨打O(2^n) 电话。
  • 为什么不使用 websockets 或 longpolling?
  • 每秒向服务器发送一个请求对服务器来说非常繁重。如果您要实现实时应用程序。使用nodeJS。

标签: javascript php jquery ajax settimeout


【解决方案1】:

您可以执行 setInterval,然后在其中执行 ajax 调用。您可以在 $.ajax 中设置的参数之一是超时 - 这样您就可以阻止多个 ajax 调用堆积并导致问题。

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

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

【讨论】:

    【解决方案2】:

    正如 Derek 所指出的,这是因为,由于 setInterval 位于函数本身内部,因此您正在进行 2^n 次调用。

    试试这样吧

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

    【讨论】:

      【解决方案3】:

      我通过简单地将setInterval 替换为setTimeout 解决了这个问题。

      【讨论】:

        猜你喜欢
        • 2016-07-10
        • 2022-12-05
        • 2018-01-14
        • 1970-01-01
        • 2021-11-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多