2011-08-14 10 views
0

こんにちは私はこの問題を説明する方法が正確ではないので、コードが私の問題を説明することを望んでいます。 ajax関数によって呼び出されるphpスクリプト(phppage.php)は、hello worldをエコーする以外に何もしません。Javascript AJAXクラスの問題

ajax関数でリコール関数にアラート( 'a')行が残っていると、コードは正常に動作し、最後の行が「hello world」というメッセージをポップアップします。ただし、アラート( 'a')行はコメントアウトされていますが、最後の行には「hello world」は表示されませんが、コンストラクタ関数で設定されている値の13になります。

私は、Firefox 3.6.18

上の任意の助けを、これをしようとしているは感謝していただければ幸いです。

function A() { 
    this.b = 13; 
    function finish(context,response) { 
     context.b = response; 
    } 
    ajax(finish,this); 
} 

A.prototype = { 
    constructor: A 
} 

function ajax(callback,context) { 
    var http = new XMLHttpRequest(); 
    var url = "phppage.php"; 
    http.open("GET", url, true); 
    http.onreadystatechange = recall; 
    function recall() { 
     alert('a'); 
     if(http.readyState == 4 && http.status == 200) { 
      callback(context,http.responseText); 
     } 
    } 
    http.send(null); 
} 

var d = new A(); 
alert(d.b); 
+0

ちょうどクロームでこれをテストし、それがない:

はしようとする場合がありますアラート( 'a')が存在するかどうかに関係なく機能します。 – Dom

+0

私はここで何が起こっているのか理解していると思います。最後の行の警告(d.b)は、ajax呼び出しがオブジェクトプロパティを返して調整する前に実行されています。 – Dom

答えて

1

コードにいくつかの問題があります。最初はあなたのfinish関数を使っていますが、コンテキスト変数を使って何をしているのかは非常に貧弱なスタイルです.Javascriptにはクロージャーという機能があります。コンストラクタは次のようになります。

function A() { 
    this.b = 13; 
    //this is how you should be storing contexts 
    var that = this; 
    function finish(response) { 
     that.b = response; 
    } 
    ajax(finish); 
} 

コンストラクタAが返された後でも、これにアクセスできます。また、Aのもとにあるプロトタイプのものは必要ありません。文字通り何もしません。

最後に、我々は、それは次のようになりますので、少しの機能あなたのAJAXを整理することができます

​​

注、これはそう何の保証は、それが動作しません、すべての未テストコードがあるが、私はそれが正しいであなたを指すようになると思います方向。

EDIT:今、あなたはそれを取り戻す前に、私はそれがすぐに返されますので、それはおそらく、非同期にその呼び出しているだけのことをAJAXを働いていると、あなたはbの値をエコーし​​ていることを認識し、私はあなたのコードを見ていること

http.open("GET", url, false); 

(しかし、彼らは本当にきれいなものまでビットをしますので、上記の私のコメントのすべてが、まだ検討すべきである)

+0

フィードバックのおかげで本当に役に立ちました。あなたは、非同期性についての最後の点があります。私はこれを見つけ、オリジナルの投稿にコメントを追加しました。また、プロトタイプラインは、 "javascript - 最終ガイド"第6版から取られました。プロトタイプを持たないコンストラクタは、コンストラクタプロパティを持たないオブジェクトを作成すると言います。 – Dom