如何在异步PHP回音(JavaScript代码)出现时执行它们?

如何在异步PHP回音(JavaScript代码)出现时执行它们?,php,javascript,ajax,echo,Php,Javascript,Ajax,Echo,我有一个带有自定义谷歌地图的页面,上面有大约100-150个标记。标记数据是通过外部PHP解析XML文件获得的,XML文件是事件/项目的列表,但每个事件中都有创建标记的适当数据 目前一切正常,但需要一段时间才能加载映射,因为解析XML文件需要一些时间。为了加快速度,我本质上希望通过在页面加载时绘制一个空白映射来动态加载页面,然后运行外部PHP文件以使用AJAX异步解析XML,并在标记从异步映射回显时将其添加到映射中。PHP循环 我不知道该怎么做,就是在这些回声到来时执行它们 包含映射的页面(ex

我有一个带有自定义谷歌地图的页面,上面有大约100-150个标记。标记数据是通过外部PHP解析XML文件获得的,XML文件是事件/项目的列表,但每个事件中都有创建标记的适当数据

目前一切正常,但需要一段时间才能加载映射,因为解析XML文件需要一些时间。为了加快速度,我本质上希望通过在页面加载时绘制一个空白映射来动态加载页面,然后运行外部PHP文件以使用AJAX异步解析XML,并在标记从异步映射回显时将其添加到映射中。PHP循环

我不知道该怎么做,就是在这些回声到来时执行它们

包含映射的页面(explore.php)运行JavaScript:

 <script type="text/javascript">;
        function init() {
            // Draw the map (blank)
            var map_focus = new google.maps.LatLng(35,-37);
            var myOptions = { zoom: 2,center: map_focus,mapTypeId: google.maps.MapTypeId.ROADMAP };  
            var map = new google.maps.Map(document.getElementById("map_canvas"), myOptions);
            var xmlhttp = new XMLHttpRequest();
            // Run PHP to parse XML, asynchronously
            xmlhttp.open("GET","project_locations.php",true);
            xmlhttp.send();
            // This is where I want the JS/AJAX to execute echoes as they come from the above call to project_locations.php
            eval(xmlhttp.responseText);
        }
        // Add marker to map. Markers would appear as fast as the XML is parsed
        function addMarker(object, name, id) {
            google.maps.event.addListener(object,"click", function() {
                window.location = "showproject.php?id=" + id;
            });
        }
    </script>
上面的代码绘制了一个空白映射,就是这样。但是,如果我使用以下命令同步运行它:

xmlhttp.open("GET","project_locations.php",false);
有一个很长的延迟,然后绘制映射和所有标记,这意味着send()之后的eval()语句将在末尾执行所有回显。如何在project_locations.php响应它们时实时执行它们?

您可以使用它执行异步HTTP(Ajax)请求


确切地说,您可以做的是,创建一个简单的HTML文件并在那里编写JavaScript函数,该函数将在一段超时时间后调用服务器方法,或者在循环中调用它,或者递归您的函数,无论您喜欢什么。我可以看看你的问题的工作样本吗。所以我可以更好地帮助您?

原因是脚本执行完成后将返回响应文本 要在下载时获取数据,您必须抓取响应文本作为下载

while(true)
   {
    xmlhttp.onreadystatechange=function() //listens to the state chnages
   {
    if(xmlhttp.readyState==3) //if its still loading
     {
      eval(xmlhttp.responseText);
     }
   }

    if(xmlhttp.readyState==4) { eval(xmlhttp.responseText);} break; //finished loading get out of for loop
   }
还要确保php没有缓冲任何输出。因此,在您的文件顶部

@ini_set('zlib.output_compression',0);
@ini_set('implicit_flush',1);
@ob_end_clean();

ob_implicit_flush(1);

由于PHP文件基本上是生成Javascript代码的,所以您可以将其作为Javascript文件包含

有了jQuery,您就可以用它来实现这一点。它应该是异步的


提示:从PHP生成JS变量时,请使用PHP函数。

我不太理解您的问题。上面的代码段是使用AJAX调用的文件吗?我刚刚添加了另一个代码段,但是是的,第一个被截断的代码将通过AJAX调用(没有我评论过的那3行代码)。也许我应该先把我知道怎么做的重新编码,然后看看这里是否有人能帮我找到丢失的部分。@Sooie那么你想要的是执行AJAX调用的代码段中的那些行吗?对的如果是这样的话,去掉标签,使用
eval(req.responseText)感谢关于eval()的提示,这有点帮助。我现在已经修改了我的困境,如上所述。@Sooie原因是只有在页面返回200和状态为4(加载后)后,才会返回响应文本。尝试我发布的代码作为anwser,告诉我这是如何投票给你的第一个答案的,因为它的态度是正确的。我已经更新了上面的代码,反映了我之前评论过的更改,希望能够澄清被问到的问题:]你能用JavaScript而不是project_locations.php来循环它吗??我的意思是,延迟发生了,因为可能有很长的循环在那里运行。这就是为什么要花这么多时间。然后,在所有循环完成后,它将很长的字符串返回给eval。所以,您可以做的是,在JavaScript中启动一个循环,并使用索引调用该循环中的xmlHttp请求。在project_locations.php的服务器端,访问该索引并仅返回该索引的数据。我对你的问题理解正确吗??
@ini_set('zlib.output_compression',0);
@ini_set('implicit_flush',1);
@ob_end_clean();

ob_implicit_flush(1);