2011-07-14 7 views
2
私は(道場で)AJAX呼び出しを行っていると私は、コールバック関数

var that = this; 
dojo.xhrGet({ 
    url : 'script.php', 
    handleAs : "javascript", 
    load : function(response){ 
     /*The callback on success*/ 
     console.log('Ajax Completed Successfully for: ' + that.name); 
    } 
}); 

に呼び出し元のオブジェクトを渡すために持っているどのような最善の方法を知っていると思った

私の質問は、 'コンパイル時に' loadが作成されたか、 '実行時に評価されるかどうかです。基本的に、thatの値がvar that = thisのときに変更され、AJAXが返されて呼び出されたときにloadを呼び出すと、この変更はloadに反映されますか?もしそうなら、AJAXリターンシグナルが正しいオブジェクトを呼び出すためのベストプラクティスは何ですか?すべてのオブジェクトに対して特定の読み込み関数を作成する必要がありますか?

おかげ

+0

JavaScriptでは**コンパイル時**のようなものはありません**ランタイム**です – Bakudan

+0

それで私はそれらを引用符で囲んでいるのです。ほとんどのスクリプト言語は実際にはコンパイルされず、解釈します。私はそれが同じ場合ehreと仮定しています – puk

答えて

4

あなたはclosure内のあなたの負荷を囲むことができます。

(function(that){ 
    dojo.xhrGet({ 
     url : 'script.php', 
     handleAs : "javascript", 
     load : function(response){ 
      /*The callback on success*/ 
      console.log('Ajax Completed Successfully for: ' + that.name); 
     } 
    }); 
})(this); 

(function(x){ })(x);一部が自己実行中の関数への引数としてxまたはthisの値を与える自己実行する機能です。値がxまたはthatのままでなければなりません。

+0

恐ろしい!あなたがベテランのJSコーダーのように見える以外に、 '(function(x){})(x);の使用があったことを知っていました。 – puk

1

あなたが何をしたいのかにもよりますが、全く使用しDeferredの作り方によってload:を作成することを避けることができます。

function get_data(){ 
    return dojo.xhrGet({ 
     url : 'script.php', 
     handleAs : "javascript", 
    }); 
} 

function other_function(){ 
    var that = this; 
    get_data().then(function(response){ 
     console.log("Ajax completed for" + that.name); 
    }); 
} 

(アヤックスが失敗したときに、これはまた、動作するかどうか、私は覚えていない - 必要性このビットをテストする)

+0

私はbetamaxの答えがより好きです。なぜなら、読みやすく、Ajaxコールを分割しないからです。しかし、「then」ステートメントについて私に教育してくれてありがとう – puk

関連する問題