Почему этот запрос AJAX занимает так много времени, когда он должен сделать несколько вызовов?


Я делаю запрос 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   2  

4 ответа:

Мне было интересно, когда этот кодекс, предполагают, чтобы работать на всех. Допустим, вся идея реализовать что-то подобное в Javascript сомнительна. Во-первых, потому что у вас нет никаких методов синхронизации в JavaScript вообще, но в вашем коде вы полагаетесь на определенный порядок выполнения вашего кода, чего нет в 99% случаев. Установив:

setTimeout( "getStatus", 6000); 

Вы создаете своего рода параллелизм, поэтому вы можете получить второй сценарий, выполненный первым, хотя и с задержкой это, но два запроса могут достичь сервера одновременно, так что, вероятно, второй скрипт не вернет вам ничего, поэтому функция успеха больше не будет выполняться.
Мой горячий совет вам рассмотреть редизайн вашего приложения, так как проблема определенно не в Javascript части вообще.

Кстати, я думаю, что использование $.вызов ajax должен быть следующим:

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

ПС. Тот факт, что ответ займет много времени, чтобы вернуться, указывает на проблему на стороне сервера, а не в вашем коде. Яваскрипт. И если мы начали говорить о журналировании, и вы упомянули firebug,вы можете использовать консоль.log ("msg") для входа в консоль firebug ваших сообщений.

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

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

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

setTimeout(getstatus,3000);

Я не уверен, что вы сталкиваетесь с медлительностью, но я бы попробовал поместить предупреждения: перед ajax и при успешном выполнении, печать в журнал php (возможно, start и finish), и предупреждение в 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
  }

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

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

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

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

Похоже на то. Судя по маленькому фрагменту кода, он тоже выглядит так. (Это весь код?)

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

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

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

Перед частью в fileReader.php - файле, который вы показали.