2009-06-08 4 views
2

私はAJAXリクエストを、変更されたテキストファイルから数値を返すPHPスクリプトにします。このAJAXリクエストは、3秒ごとに発生する必要があります。ただし、AJAXリクエストは一度行われ、何も返されず、AJAX GETリクエストがまだ行われていることを示すファイルがあります。数分後に戻り値が生成されます。それは複数の呼び出しをしているはずですが、それは1つしか作成していませんでした、そして、それは最終的な答えで戻ってきました。私はこれがどう起こったのか把握するのに苦労しています! :(なぜこのAJAXリクエストは複数回コールする必要があるのですか?

//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関連のある期待しています。

ありがとうございました。

答えて

1

このコードがまったく動作すると思っていたときはいつも不思議でした。 Javascriptでこれに似た何かを実装する考え方全体が疑わしいとしましょう。まず第一に、JavaScriptでの同期技術はまったくないので、コードではコードの特定の実行順序に依存しています。これは99%に当てはまりません。設定することによって:

setTimeout("getStatus", 6000); 

をあなたがそれを遅らせたが、あなたは、したがって、あなたが最初に実行される第2のスクリプトを取得することができ、並行処理の種類を作成しますが、2つの要求が同時にサーバーに到達することができますので、おそらく2番目のスクリプトは、意志何も返さないので、成功関数はもう実行されません。
あなたのアプリケーションの再設計を検討することをお勧めします。なぜなら、問題はJavascriptの部分に全くないからです。

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

PS:

はところで、私は$アヤックスコールの使用はのようにあると思います。応答が、JavaScript側のコードではなく、サーバー側の問題を返すために多くの時間を要するという事実。そして、もし我々がロギングについて話を始めて、あなたがファイヤーバグについて言及していれば、console.log( "msg")を使ってfirebugにメッセージをコンソールでログオンすることができます。

+0

あなたはそれがJSの部分ではないのは間違いありません。それは私が思っている別のAJAXメソッドが作られていたので、長い間何も戻ってこないPHPの問題であることが判明しました!私はそれを再設計する必要がある! – Abs

1

私はあなたが

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

を行うことができるかどうかわからないが、私は、私はあなたが遅さでに実行されているかわからないんだけど、私、あなたが

setTimeout(getstatus,3000); 

を行うことができますことを知っていますあなたは、タイムアウトが発生したときに、continueTimeoutを設定したときに、おそらくアラートを受け取ったときに、javascriptでアラートを入れてみましょう:Like:

あなたがよりよい代わりのsetTimeout

ののsetIntervalを使用する必要があります

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

また、FirebugまたはWebkitを使用している場合は、警告の代わりにconsole.log()を実行してください。 –

+0

はい、またはエラーIDを持つテキストエリアを作成して表示することもできます。 var log = $( '#errorlogging'); log.val(log.val()+ "エラーメッセージ... \ n"); – Lathan

+0

Lathanと同じように、単純な警告バージョンをデバッグに使用します。私は、getstatus関数は、AJAXリクエストの1回の試行と応答でのみ返されることがわかりました。 AJAXコールの継続は決して達成されません。そのPHPスクリプトの処理は非常に遅くなければなりません!! – Abs

1

はまた、あなたが新しい変数を使用しているとき、「VAR」を忘れてはいけません。

渡されたパラメータが正しい場合でも、ajaxリクエストで何も返されない場合、原因はサーバー側です。

+0

あなたが言うように "3秒ごと"に行く場合、setTimeoutではなくsetIntervalが必要なので、setTimeoutは遅れて1回だけ起動します。 –

+0

実際に彼は常にそれらの機能を実行したくないので、彼はsetTimeoutを使用しています。あなたは見ることができる、彼は "ピンポン"の方法で、彼らはそれぞれ特定の条件の下で別の呼び出しを呼び出す。 –

0

fileReader.phpは無限ループで呼ばれていますか?

確かにそうです。そこにある小さなコードスニペットを見てみると、確かにそのように見えます。 (コード全体ですか?)

fileReader.phpの場合は、Webサーバーがクライアントごとに許可している呼び出しを多くしている可能性があります。その結果、スタックオーバーフローエラーが発生しない理由を説明します。 。 ajaxがタイムアウトすると(60秒後など)、fileReader.phpコールスタック全体が消滅し、最初のajaxからの回答が残っています。あるいは、最初のfileReader -callの答えが残っているかもしれません。確かにわからない。

たぶん、あなたが示した-file fileReader.phpで一部の前

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

を追加してみてください。

関連する問題