Почему этот AJAX-запрос занимает так много времени, когда он должен сделать несколько вызовов? - PullRequest
2 голосов
/ 08 июня 2009

Я делаю AJAX-запрос к PHP-скрипту, который возвращает число из текстового файла, который изменяется. Этот 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
}

PHP-скрипт, который вызывает вторая функция JavaScript, выглядит так:

$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-запрос?

Этот вопрос связан с другим вопросом . PHP-скрипт, который я раньше считал медленным. Я надеюсь, что проблема связана с JavaScript.

Спасибо всем за любую помощь.

Ответы [ 4 ]

1 голос
/ 08 июня 2009

Вам лучше использовать setInterval вместо setTimeout

также не забывайте "var", когда вы используете новую переменную.

Если переданные параметры верны и запрос ajax по-прежнему ничего не возвращает, то виновник на стороне сервера.

1 голос
/ 08 июня 2009

Мне было интересно, когда этот код должен работать вообще. Допустим, сама идея реализовать нечто подобное в 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 ваших сообщений.

1 голос
/ 08 июня 2009

Я не уверен, что вы можете сделать

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

но я знаю, что вы можете сделать

setTimeout(getstatus,3000);

Я не уверен, с чем вы сталкиваетесь с медлительностью, но я бы попытался поставить оповещения: до ajax и при успехе распечатать в php (возможно начало и конец) и предупредить JavaScript, когда вы устанавливаете continueTimeout, возможно, даже предупредить, когда истекает время ожидания ... Как:

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
  }
0 голосов
/ 09 июня 2009

fileReader.php вызывает себя в бесконечном цикле?

Конечно, звучит так. Взглянув на небольшой фрагмент кода, он тоже наверняка выглядит. (Это весь код?)

Если fileReader.php, то он, вероятно, совершает столько вызовов, сколько позволяет веб-сервер на каждого клиента, а затем переводится в режим ожидания, что объясняет, почему вы не получаете ошибку переполнения стека. Когда время ожидания Ajax истекает (через 60 секунд или что-то еще), весь стек вызовов fileReader.php просто исчезает, и вы получаете ответ от первого Ajax. Или, может быть, вы остались с ответом на первый fileReader звонок. Эх не уверен.

Может быть, попробуйте добавить

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

перед частью показанного вами файла fileReader.php.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...