【问题标题】:How can I get data instantly with ajax?如何使用 ajax 立即获取数据?
【发布时间】:2011-11-07 03:27:15
【问题描述】:

我正在尝试使用 ajax 立即获取数据,但我做不到。问题是,当我发出请求时,响应即将结束 php 进程。我想在每个 echo 命令之后获取数据。所以这里是一个简单的例子。有两个文件,主html文件(包括javascript)和php文件。

try.html

<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Get Data</title>
<script type="text/javascript">
function makeObject() {
    var newObject;
    var browser = navigator.appName;
    if(browser == "Microsoft Internet Explorer"){
        newObject = new ActiveXObject("Microsoft.XMLHTTP");
    }
    else {
        newObject = new XMLHttpRequest();
    }
    if (newObject.overrideMimeType) {
        newObject.overrideMimeType('text/xml; charset=UTF-8;');
    }   
    return newObject;
}

var newOne=makeObject();

function getData()
{
    newOne.open('get','process.php',true);
    newOne.onreadystatechange=function(){
        if (newOne.readyState==4)
        {
            var box=document.getElementById("queryResult");
            box.innerHTML=newOne.responseText;
        }
    }
    newOne.send(null);
}
</script>
</head>    
<body>
<input type="button" id="doit" value="Start Query" onclick="getData();" />
<div id="queryResult"></div>
</body>
</html>

和process.php

<?php
echo "1";
sleep(1);
echo "2";
sleep(1);
echo "3";
sleep(1);
echo "4";
sleep(1);
echo "5";
?>

当我单击开始查询按钮时,它等待 4 秒,然后同时写入 12345。我想写 1 并等待 1 秒然后写 2 并等待 1 秒然后写 3 等等。我该怎么做?对不起我的英语,谢谢你的回答:)

【问题讨论】:

  • 您的整个&lt;?php ?&gt; 代码同时集中在一起。您的echo 命令不会发送到客户端,而是发送到将一次性发送到客户端的数据队列。
  • 你真正想要完成什么?这可能可以通过摆弄 PHP 的输出缓冲来完成,但这可能不是你应该做的任何你想做的事情。
  • 在 JS 中而不是 PHP 中进行所有这些延迟。
  • 我认为您应该在 JavaScript 中执行延迟部分,同时在开始时请求整个数据集或在每个 JS-timeout/-interval 之后发送新请求。
  • 我实际上想在 php 端发送邮件。每发送一封邮件后,它都会为 ex 回显。 “邮件已成功发送/未成功发送 example@example.com。”我可以采用不同的方式,例如,getData 函数接受一个参数并将其发送到 php,所以当我调用该函数时,只发送了 1 封邮件。当响应到来时,它会调用不同的参数。我认为这会使用这么多的数据流量。我说的对吗?

标签: php ajax comet


【解决方案1】:

如果我理解您的问题,您将需要进行 4 次 ajax 方法调用。由于您期望每次调用都有不同的值,因此您需要将状态保存在某处(在客户端或服务器上),以便您知道您正在进行哪个调用。如果您的示例中的暂停是您预期程序的一部分(而不仅仅是为了示例),那么在您的客户端 Javascript 中可能会更好。

【讨论】:

    【解决方案2】:

    您的代码完全按照您的要求执行。 ajax 响应是在客户端收到最后一个字节时提供给您的,而不是在收到时提供给您。

    如果您希望从服务器端出现在客户端,则客户端必须轮询并且服务器保持某种状态以进行响应,而不是像您在服务器尝试发送流响应时那样。新的 HTML5 客户端套接字可以帮助您,而不是轮询客户端可以由服务器调用

    【讨论】:

      【解决方案3】:

      您需要使用 html5 网络套接字。在请求完成之前,使用标准 ajax 不会返回。

      【讨论】:

        【解决方案4】:

        ajax 等待响应,因此您正在等待最终响应。你将不得不做单独的请求。可能设置后续请求取决于先前请求的结果。

        【讨论】:

          【解决方案5】:

          服务器缓冲它们的输出 - 发送单个字符非常浪费网络资源。要强制 PHP 和网络服务器刷新它们的缓冲区,您至少需要:

          echo "1";
          flush();
          ob_flush();
          echo "2";
          etc...
          

          【讨论】:

          • 通过套接字发送它,但它仍然会在客户端缓冲,直到请求完成。它只会让它变慢。
          • 很遗憾,XMLHttpRequest 不支持渐进式下载。当 readyState 为 3 时(表示内容已经由服务器发送但未全部发送),尝试读取响应将返回错误。只有当 readyState 为 4 时才能读取响应,这意味着完整的响应头和响应体都可用。
          猜你喜欢
          • 2015-09-01
          • 1970-01-01
          • 1970-01-01
          • 2022-08-23
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多