-1

私は以下のjQueryコードを持っています..

(function( $ ) {

$.fn.pokerClass = function( test ) {
    var test;

    this.a = function(){
                    $.ajax({
                        type: "POST",
                        url: "http://127.0.0.1/test.php",
                        success: function(data){
                            var json = $.parseJSON(data);
                            test = json.value; 
                            }
                    });
    }
    this.b = function() {
        alert("i am " + test);
    };
    this.class_var = test;
    return this;
};


})( jQuery );

HTML:

var t = $(document.body).testClass();
t.a();
t.b();

「私は未定義です」という応答が得られます。誰でもこの問題を解決する方法を教えてもらえますか?

4

3 に答える 3

4

ajax 呼び出しは非同期で実行されるため、t.b();実行時にtestまだ値がありません。

ajax呼び出しを同期的に実行するasync:falseか( )、コールバックt.b();内で実行できますsuccess

于 2012-06-29T19:03:59.217 に答える
3

ajax のasync fromを使用しています。つまり、システムは ajax が終了するのを待たずに残りの処理を進めます。

使うだけ

$.ajax({
                        type: "POST",
                        async:false, /* Note this */
                        url: "http://127.0.0.1/test.php",
                        success: function(data){
                            var json = $.parseJSON(data);
                            test = json.value; 
                            }
                    });
于 2012-06-29T19:04:37.497 に答える
0
  • 私はあなたが呼ぶつもりpokerClassではないと思いますtestClassか?

  • testすでに定義されている警告が表示されます。これは関数の引数であり、。を使用して再度宣言しますvar test;。関数に何も渡さないので、関数の引数を削除できます。

  • JSONデータを取得POSTするには、何も送信せずにリクエストを行います。代わりにgetJSON関数を使用することを検討してください。ただし、その省略関数を使用して非同期設定を設定することはできません。dataType期待される応答のをに設定することもできますjson。その後、自動的に解析されます。

  • Claudio Rediが(最初に)言ったように:ajax呼び出しをに設定しasync:falseます。.when()非同期リクエストの応答を待つために、やや高度な機能を調べることをお勧めします。

未検証:

(function( $ ) {
  $.fn.pokerClass = function( ) {
    var test;

    this.a = function(){
      $.ajax({
        type: "GET",
        async: false,
        dataType: "json",
        url: "http://127.0.0.1/test.php",
        success: function(data){
          test = data.value;
        },
        error: function(){
          console.log("Did not work.");
        }
      });
    };
    this.b = function() {
      console.log("I am " + test);
    };
    this.class_var = test;
    return this;
  };
})( jQuery );

var t = $("document.body").pokerClass();
t.a();
t.b();
于 2012-06-29T19:42:12.540 に答える