【问题标题】:Execute an Ajax request every second [duplicate]每秒执行一次 Ajax 请求 [重复]
【发布时间】:2013-12-04 18:10:57
【问题描述】:

我对 php 文件进行了 ajax 调用。我正在收到结果。现在我正在调查是否可以让 ajax 请求每 1 秒自动执行一次。我将结果发布到名为hidden 的输入字段中。如何每三秒执行一次 ajax 调用而不必调用该函数?

    $.ajax({
            type: 'POST',
            url: 'increment.php',
            data: $(this).serialize(),
            dataType: 'json',
            success: function (data) {
                    $('#hidden').val(data);// first set the value     

            }
    });

【问题讨论】:

  • “每秒执行一次 Ajax 请求” 不,请不要。 :-)
  • @T.J.Crowder 我知道这不是好的做法。这只是为了学习。

标签: jquery ajax


【解决方案1】:

您可以通过一系列重复的setTimeout 调用来做到这一点。 (不要setIntervalajax 调用一起使用,您很快就会陷入混乱;setInterval 将触发下一个 ajax 调用,即使前一个调用尚未完成.)

使用setTimeout 安排第一次通话,然后在完成后安排下一次通话,等等:

var interval = 1000;  // 1000 = 1 second, 3000 = 3 seconds
function doAjax() {
    $.ajax({
            type: 'POST',
            url: 'increment.php',
            data: $(this).serialize(),
            dataType: 'json',
            success: function (data) {
                    $('#hidden').val(data);// first set the value     
            },
            complete: function (data) {
                    // Schedule the next
                    setTimeout(doAjax, interval);
            }
    });
}
setTimeout(doAjax, interval);

请注意,我使用complete,而不是success 来安排下一次通话,因此中断(您的网络连接暂时中断等)不会终止进程。

【讨论】:

  • 现在为什么使用setTimeout 而不是setInterval 更有意义。
  • 你能用always替换complete吗,因为旧的现在已弃用?
  • @Dharman - 你让我担心了一秒钟,我想“他们肯定不会弃用 that 吗?!”和they haven'tcomplete option(上面使用过)不被弃用。 jqXHR 对象 ajax 返回(上面未使用)上的 complete 方法 已弃用。 :-)
【解决方案2】:

您可能要考虑的是Server Sent Events(SSE)

这是一种 HTML5 技术,Javascript 将“long-poll”服务器端点(您的 PHP 文件)以查看是否发生了任何更改。长轮询基本上是 JS(我不确定它是使用 Ajax 还是其他技术)每秒向端点发送一个请求的地方

你可以这样试试:

#/your_js
var evtSource = new EventSource("increment.php");
evtSource.onmessage = function(e) {
    $('#hidden').val(e.data);
}

要发送数据,您可以进行 ajax 调用,它将更新的 JSON 对象发送到服务器,就像您所做的那样:

  $(document).on("click", ".your_object", function(data) {
     $.ajax({
                type: 'POST',
                url: 'increment.php',
                data: $(this).serialize(),
                dataType: 'json'
        });
   });

这只会在您执行事件时打开 Ajax 请求,并且您的应用将每秒“侦听”响应。如您所知,Ajax 长轮询是超级资源密集型的,因此如果您想要真正的“实时”技术,最好查看 web-socket 的东西,但无论哪种方式,这将是一个更高效的系统不仅仅是使用普通的 ajax 来处理所有事情

这里需要注意的是 - 您必须更改您的 increment.php 以处理不同的响应类型

【讨论】:

  • 如果您对此感兴趣,我可以详细说明
  • 非常好,我不知道这一点。我不断检查increment.php 以获取表中的当前行数。我会阅读更多内容
  • +1 有一个 HTML5 解决方案很有趣。
  • 当我们尝试在我们的一个应用程序中创建一些实时通知时,我与 SSE 合作过。起初感觉就像是一个雷区,但实际上做起来很简单,尤其是如果您使用的是框架。如果没有,部署起来还是很简单的
  • 非常有趣,但截至Can I use,IE/Edge 似乎还不支持它
【解决方案3】:

可以,使用 setInterval

1) 将 ajax 保存在函数中。

function fun() {
$.ajax({
            type: 'POST',
            url: 'increment.php',
            data: $(this).serialize(),
            dataType: 'json',
            success: function (data) {
                    $('#hidden').val(data);// first set the value     

            }
    });
}

2) 现在使用setInterval,可以每秒执行一次。

var interval = setInterval(fun, 1000);

3) 暂停/清除使用clearInterval

clearInterval(interval);

4) 正如其他人指出的那样,将setInterval 用于 ajax 是不明智的,因此请尝试使用

var interval;
function callAjax() {
  $.ajax({
                type: 'POST',
                url: 'increment.php',
                data: $(this).serialize(),
                dataType: 'json',
                success: function (data) {
                        $('#hidden').val(data);// first set the value 
                        interval = setTimeout(callAjax, 1000);   
                }
        });
}
callAjax();
//clearTimeout(interval);

【讨论】:

  • 没错,但我更喜欢使用setTimeoutclearTimeout,这样即使服务器在执行后端时有点慢,你也不会收到重叠的请求。
  • 使用ajax时,肯定使用重复的setTimeout(在前一个完成时安排下一个)而不是setInterval。使用 setInterval 和 ajax 请求,您会遇到混乱。
  • 您的setTimeout 示例总共导致对函数的两次调用。
  • @T.J.Crowder 抱歉。我得到了我所犯的错误。我已经纠正了。但是 +1 让我们了解complete 回调。非常明智的解决方案。谢谢。
  • @PraveenJeganathan 如果你在匿名函数中设置了interval,你最好不要设置它。要么在全局范围内声明变量,要么根本不去声明它。它也是clearTimeout(interval) 而不是clearTimeout(fun)
猜你喜欢
  • 2020-02-02
  • 1970-01-01
  • 2021-04-22
  • 1970-01-01
  • 1970-01-01
  • 2016-05-23
  • 2016-10-14
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多