2010-12-10 15 views
1

を実行するためにfailes JavaScriptのAJAX:時々私は、次のAjax機能使用してい

function callAjax(request,callback) 
{ 
    if (window.XMLHttpRequest) 
    {// code for IE7+, Firefox, Chrome, Opera, Safari 
     xmlhttp=new XMLHttpRequest(); 
    } 
    else 
    {// code for IE6, IE5 
     xmlhttp=new ActiveXObject("Microsoft.XMLHTTP"); 
    } 
    xmlhttp.onreadystatechange=function() 
    { 
     if (xmlhttp.readyState==4 && xmlhttp.status==200) 
     { 
      if(callback != null)callback(xmlhttp.responseText); 
     } 
    } 
    xmlhttp.open("GET",request,true); 
    xmlhttp.send(); 
} 

をそして私は、私は順番に3回以上、この関数を呼び出すときに、コールバックの一部が時々ではないことを発見しました実行される。 ajaxリクエストが発生し、結果が返されますが、何とかコールバック関数が呼び出されません。さらに悪いことに、これは一貫して起こることさえありません。私が知りたいことは、なぜですか?さらに重要なことは、どうすれば修正できますか?私が知る限り、それらの間に少なくとも4ミリ秒のギャップがあれば、コールバックが実行されます。その期間内に2つのページが返ってくると、そのうちの1つだけ(私は信じていますが、それがいつも確実ではないと思います)が実際に処理されます。

私はこれを回避するために、一度に1つのAjaxリクエストが(スリープ()のリベラルな使用を通じて)戻るのを待っていることを確認することができます。ただし、これによりページが大幅に遅くなります。私は、3つ(またはそれ以上)の要求をすべて消して、彼らが戻るたびにコールバックを実行させたいと思っています。

私は間違っていますか? どうすればいいですか?

NB:「ああ、あなたはjqueryを使うべきだ」と言ってくれる人は探していません。私はこれのために外部ライブラリを使用したくない - ちょうど私が持っているコードを修正する方法を教えてください。

+0

GETではなくPOSTで同じことが起こりますか? – Pieter

+0

@Pieterはい、POSTとGETの場合と同じ結果 – Benubird

答えて

0

xmlhttpはグローバル変数なので、複数のコールが同時に発生している場合は上書きされます。

また、GETリクエストも使用しています。不適切な見出しが設定されていない場合、GETリクエストはキャッシュされます。キャッシングを回避する方法の詳細については、"heartbeat" logger qustionを参照してください。

+0

これについてはわかりません。はい、グローバル変数ですが、オブジェクトへのポインタです。関数の初めに、新しいオブジェクトを指すように割り当てられますが、オリジナルはまだ存在します。さらに、これが問題であれば、3回のコールバックが間違ったコールバックであっても、1または2だけでなく、3つのコールバックを見ることが期待されます。 – Benubird

+0

これはホワイトボードのようなものです。リクエストが開いていて、前のリクエストを上書きした場合は、それはなくなっています。あなたは3コールバックを取得しません。あなたは最後のものを手に入れます。それはあなたが見ているものです。ローカルにして、あなたは魔法を見るでしょう。 – epascarello

+0

あなたがしなければならないことは、そこにvarを貼り付けることです、私の解決策をテストすることは難しいことではありません。 – epascarello

0

ほとんどの場合、ステータスは200ではありません。コールバックは、現在のコードでステータス200の場合にのみ発生します。

xmlhttp.onreadystatechange=function() 
{ 
    if (xmlhttp.readyState==4 && xmlhttp.status==200) 
    { 
     if(typeof callback == 'function') 
      callback.call(xmlhttp, xmlhttp.responseText); 
    } 
    else{ 
     alert("status is " + xmlhttp.status); 
    } 

} 
+0

私は火かき棒でそれを見るとステータスは200です。 – Benubird

0

リクエストに乱数変数を追加することで簡単に修正できます。ページのキャッシュに問題がある可能性があります。

また、私が間違っていないと、ブラウザは一度に同時に最大数のAjaxリクエストを受け取ります。

+0

ajaxリクエストが返され、Firebugsコンソールで正しい結果が確認できますが、コールバック関数が実行されません。 – Benubird

関連する問題