为什么这个AJAX请求需要多长时间进行多次调用?

时间:2009-06-08 18:21:59

标签: php javascript jquery ajax

我向PHP脚本发出一个AJAX请求,该脚本从更改的文本文件中返回一个数字。这个AJAX请求应该每3秒发生一次。但是,AJAX请求只进行一次并且它不返回任何内容,并且firebug显示仍在进行AJAX GET请求。几分钟后它返回并产生一个数字。它应该已经进行了多次调用,但它只进行了一次,它只是回来了最终答案。我正在努力弄清楚这是怎么发生的!? :(

//this is called first which calls getStatus which should get the progres of the
//conversion. This AJAX request takes a long time to come back which may hinder the
//getStatus coming back quickly maybe?
function convertNow(validURL){

       startTime = setTimeout('getStatus();', 6000);
       $.ajax({
       type: "GET",
       url: "main.php",
       data: 'url=' + validURL + '&filename=' + fileNameTxt,
       success: function(msg){  
       }//function     
     });//ajax

}//function convertNow

function getStatus(){

    $.ajax({
    type: "POST",
    url: "fileReader.php",
    data: 'textFile=' + fileNameTxt,
    success: function(respomse){
    textFileResponse = respomse.split(" ");
    $("#done").html("Downloading" + textFileResponse[0]);

    if(textFileResponse[0]=='100.0%'){
            $("#loading").hide("slow");
        $("#done").html("Complete");   
        return;
    }
        continueTime = setTimeout('getStatus();', 3000); 
    }
    });//ajax
}

第二个JavaScript函数调用的PHP脚本是:

$fileName = $_POST['textFile'];
//calls an external script to get the text file output
$result = file_get_contents($_SESSION['serverURL']."fileReader.php?textFile=$fileName");
echo $result;

以上是否正确,我的逻辑是否在上面捕获?或者上述意味着只会发出一个AJAX请求?

这个问题与another question有关。我之前认为的PHP脚本很慢。我希望这个问题现在与JavaScript有关。

谢谢大家的帮助。

4 个答案:

答案 0 :(得分:1)

我不确定你能否做到

setTimeout("getStatus();",3000);

但我知道你可以做到

setTimeout(getstatus,3000);

我不确定你遇到的是什么慢,但我会尝试将警报放入:在ajax之前,并且在成功时,打印到php中的日志(可能的开始和结束),并提醒设置continueTimeout时的javascript,甚至可能在超时触发时发出警报...... 像:

function getStatus(){
  alert('getStatus Started');
  $.ajax({
    type: "POST",
    url: "fileReader.php",
    data: 'textFile=' + fileNameTxt,
    success: function(respomse){
      alert('ajax success');
      textFileResponse = respomse.split(" ");
      $("#done").html("Downloading" + textFileResponse[0]);
      if(textFileResponse[0]=='100.0%'){
        $("#loading").hide("slow");
        $("#done").html("Complete");   
        return;
        }
      alert('starting continuetime');
      continueTime = setTimeout(**getStatus**, 3000); 
      }
    });//ajax
  }

答案 1 :(得分:1)

您最好使用setInterval而不是setTimeout

在使用新变量时也不要忘记“var”。

如果传递的参数是正确的并且ajax请求仍然没有返回任何内容,那么罪魁祸首就是服务器端。

答案 2 :(得分:1)

我想知道这个代码什么时候才能起作用。让我们说在Javascript中实现与此类似的东西的整个想法是值得怀疑的。首先,因为您根本没有JavaScript中的任何同步技术,但在您的代码中,您依赖于代码的特定执行顺序,而99%的情况并非如此。通过设置:

setTimeout( "getStatus", 6000); 

你创建了一种并发,因此你可以先执行第二个脚本,虽然你把它推迟了,但是两个请求可以同时到达服务器,所以第二个脚本可能不会返回任何东西,所以成功功能将不再执行。
我给你的热门建议考虑重新设计你的应用程序,因为问题根本不在Javascript部分。

顺便说一下,我认为使用$ .ajax调用必须如下:

$.ajax({
type: "POST",
url: "fileReader.php",
data: { param1: value1, param2:value2...etc},
success: function(respomse){ ...}});

PS。响应花费大量时间返回的事实指向服务器端的问题,而不是Javascript中的代码。如果我们开始谈论日志记录并且您已经提到过firebug,您可以使用console.log(“msg”)登录firebug控制台消息。

答案 3 :(得分:0)

fileReader.php是否在无限循环中调用自己?

当然听起来像。通过查看那里的小代码片段,它看起来确实如此。 (那是整个代码吗?)

如果是fileReader.php,那么它可能会为每个客户端进行与Web服务器允许的调用次数相同的数量,然后将其置于保持状态,这就解释了为什么您没有收到堆栈溢出错误。当ajax超时(60秒后或其他任何时间)时,整个fileReader.php调用堆栈就会消失,而你将得到第一个ajax的答案。或者也许你留下了第一个fileReader - 电话的答案。呃不确定。

也许尝试添加

if(!isset($_POST['textFile'])){echo "ERR: POST['textfile'] not set!"; exit(-1);}

在您显示的fileReader.php - 文件中的部分之前