0

関数の下にプロパティを割り当てようとしています。私は持っている

test.prototype.getName = function(){
    var myself=this;

     //ajax callback function
      call.callback = function(obj){

     //I want to assign returned ajax obj to test property.       
        myself.testName=obj;
      }

}


test.prototype.build = function(){

this.getName();

console.log(this.testName)//undefined...

}


test.build();

ビルド関数に表示される this.testName を取得するにはどうすればよいですか? どうもありがとう!

4

3 に答える 3

1

非同期関数の性質上、コールバック関数を使用する必要があります。console.log関数をtoに渡し、getName非同期操作が完了したときに実行します。

test.prototype.getName = function(callback){
    var myself=this;

    //ajax callback function
    call.callback = function(obj){

        //I want to assign returned ajax obj to test property.       
        myself.testName=obj;
        callback();
    }
}

test.prototype.build = function(){ 
    var myself = this;

    this.getName(function() {
        console.log(myself.testName)
    });
}
于 2012-12-17T19:44:54.050 に答える
1

あなたが与えたコードに基づいて、私は次の仮定をしています:

仮定 1:

オブジェクトまたは関数を返す関数にテストを初期化しましたが、そのコードを質問に含めていません。これをコンストラクタと呼びます。私はそれが次のように見えると仮定します:



    function test(){
        //do some work here
        return this;
    }

//or

    var test = function(){
        //do some work here
        return this;
    }

これは、エラーをスローせずにプロトタイプのプロパティを設定できるためだと思います。これは、上記の方法で可能になります。

仮定 2:

テスト オブジェクトの複数のインスタンスを含むオブジェクト指向ソリューションを使用しようとしていると思います。この仮定は、プロトタイプの継承を使用することを目指しているという事実に基づいています。これは、「テスト」関数が 1 つのバージョンのみを持つことを意図している場合 (これはシングルトンと呼ばれます)、それほど重要ではありません。

これらの仮定に基づくと、問題は、テスト オブジェクトのインスタンスを作成していないことです。次のコードは正常に動作するはずです (仮定 1 に依存します)。



    var testInstance = new test();
    testInstance.build();
    // wait for AJAX to return and execute success handler
    testInstance.property // returns a proper value

ビルドが一度だけ行うもので、テスト オブジェクトのすべてのインスタンスに対して実行するものである場合は、それをコンストラクター自体に入れることができます。



    function test(){
        this.build();
        return this;
    };
    
    
    var testInstance = new test();
    // wait for AJAX to return and execute success handler
    testInstance.property // returns a proper value

setTimeout非同期呼び出しとして使用する完全なテストを次に示します



    function Test(){
        //do anything
        return this
    };
    Test.prototype.getName = function(){
        var self = this;
    
        //simulate AJAX with setTimeout
        setTimeout(
        function(){
            self.testName = "Ahmad Jamal";
            console.log('name set');   
        }, 1000);
    };
    Test.prototype.build = function(){
        this.getName();
        console.log(this.testName); // this is undefined, as the setTimeout is still waiting
    };
    
    var test = new Test();
    
    test.build();
    // now wait to see 'name set' in the console
    
    test.testName; // returns "Ahmad Jamal"

于 2012-12-17T23:19:33.270 に答える
0

このようなもの?

function MyClass () {}

function test () {}

test.prototype = new MyClass();

test.prototype.getName = function(callback){
    this.testName = callback();
};

test.prototype.build = function(){
    this.getName(function() {
        return 'this is my test name';
    });
    console.log(this.testName);
}

var myobj = new test();
myobj.build();
于 2012-12-17T20:33:17.657 に答える