【问题标题】:Could AJAX results be out of synch and cause a discrepancy in polled results?AJAX 结果是否会不同步并导致轮询结果出现差异?
【发布时间】:2012-05-14 14:38:38
【问题描述】:

我正在使用 jQuery、AJAX、PHP 和 mySQL 开发类似于拍卖的功能。

Ajax 每秒访问服务器以获取最新的出价,在此调用期间,我们还从服务器获取剩余时间以使所有参与者保持同步。

我有两个问题:

1) 有时,剩余时间会在几分之一秒内闪回到前一时间的值。这可能与异步结果不同步有关吗?

相关代码片段:

function dotimer() {
    updateScreen();
    setTimeout('dotimer()',1000);
}

function updateScreen(){
    $.ajax({
        type : 'POST',
        url : 'getinfo.php',
        dataType : 'json',
        data: { /* various params are passed to php */ },
        success : function(data){
            /* other info processed here...*/
            $("#countdowntimer").html(data.secondsremaining);           
        },
        error : function(XMLHttpRequest, textStatus, errorThrown) {}
    });
}

getinfo.php:

$return['secondsremaining'] = strtotime($end_time)-strtotime("now");
/* get other infor from database... */
echo json_encode($return);

(setTimeout 和 setInterval 的结果相同。)

2) 每秒访问数据库是否过多?我看不到确保信息是最新的替代方法。有一个更好的方法吗? 拍卖的时间相对较短(30 分钟),我们预计参加者不会超过 10 人。

欢迎任何意见/建议,谢谢!

【问题讨论】:

    标签: php ajax settimeout


    【解决方案1】:

    我认为这正是你的问题。由于请求是异步的,因此您无法控制它们的执行顺序。您必须同步您的请求并避免多个请求,即,如果没有待处理的请求,您只能执行一个新请求,否则您无法控制每个请求的回调何时触发。

    【讨论】:

    • 感谢您的回答@woozy。你如何建议这样做?同步请求不会导致页面在允许用户与之交互之前等待每个请求完成吗?我们不想阻止用户在页面与服务器交互时出价 - 他们甚至不应该意识到这种情况正在发生。
    • 请求同步不会影响页面交互,因为它们在后台运行。我建议您尝试在每个请求回调上运行新请求,而不是每秒运行一次。
    • 抱歉,有人告诉我使用 SJAX 会产生这种效果,所以我什至没有查看同步请求。最好的方法是什么 - 在成功和错误回调函数中调用 setTimeout?它还需要更改流程的逻辑 - 因为我们每秒都在进行调用,所以我们也选择返回服务器时间。现在计时器将不再每秒倒计时,因此我需要一个单独的倒计时计时器并且必须将其与服务器时间同步,因为 js 倒计时不准确。至关重要的是所有参与者都尽可能同步。
    • 在回调中你会调用 updateScreen() 而不是 setTimeout。也许您可以为计时器使用单独的处理程序。例如,您可以从服务器获取 unix 时间戳中的 endTime,然后使用 javascript 计算该时间戳上的剩余时间。然后有一个单独的处理程序来检查服务器的结束时间并在必要时在客户端进行更新。当然,您应该在邮票上加上一些非常重要的信息以避免欺诈。
    • 我需要在回调中超时,否则 ajax 调用将每秒多次访问服务器和数据库(有点过分)!我会遇到一种类似的方式,即每 10 秒与一个单独的处理程序同步时间,就像你建议的那样......我想我想出了一种方法来同时进行两个调用,但不幸的是我没有预见到这一点问题:) 看来我可能不得不使用单独的处理程序。感谢您的帮助!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-07-16
    • 2015-04-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-06-01
    • 2013-08-12
    相关资源
    最近更新 更多