0

コールバックを使用して非同期呼び出しから戻ると、クラスのコンストラクターにアクセスできません。

この場合、Myclass1コンストラクターで定義されたテスト変数にアクセスできません

私はこれに対する解決策を見つけることができません、私は何を間違っているのですか?

var MyClass1 = function () {

    this.test = 5;
};
MyClass1.prototype = function () {
    //This is the function which calls another Myclass2 which contains the function for ajax //request
    test = function () {
        myClass2 = new MyClass2();
        myClass2.getRequest.call(this, callback);
    },
    //This is the call Back
    callback = function () {
        alert(this.test); /*<---Cannot access this,shows undefined.In firebug it show this.test is not defined*/
    };

    return {
        test: test,
        callback: callback
    }
}

MyClass2.prototype = function () {
    getRequest = function () {
        //make an async call set the success to the callback .I have propagated the data to //myclass1
        $.ajax({
            url: "test.html",
            success: callBack.call(this, data) //<--I call the callback using myClass1
        })
    }

    return {
        getRequest: getRequest;
    }
}
4

1 に答える 1

3

わかりましたので、多くのポイントがあります。

初め

プロトタイプ作成の際は、変数を宣言してください。「var」を使用しないため、現在、「test」、「callback」、および「getRequest」グローバル変数を作成しています。

MyClass1.prototype = function () {
    var test = function () {
        // some code...
    };

    var callback = function () {
        // some code...
    };

    // And more code...
};

また、「テスト」宣言の最後のコンマは演算子であるため機能しますが、意図したとおりに機能しないと確信しています。

または、関数を直接作成できます。

MyClass1.prototype = function () {
    function test() {
        // some code...
    }

    function callback() {
        // some code...
    }

    // And more code...
};

2番

「プロトタイプ」プロパティを関数に割り当てています

MyClass1.prototype = function() { ... };

これは、クラスのプロトタイプが「call」、「apply」、「bind」メソッドを持ち、「test」や「callback」を持たない関数であることを意味します。おそらく、即時呼び出し関数式 (IIFE) を作成したかったでしょう。

MyClass1.prototype = (function() {
    function methodA() {
        // some code...
    }

    return {
        methodA: methodA
    };
})();

または単純なオブジェクト:

MyClass1.prototype = {
    methodA: function() {
        // some code...
    },
    methodB: function() {
        // some code...
    }
};

三番

あなたのコードが何をしているのかわかりません.「MyClass2」はどこで定義されていますか.「MyClass1」を拡張していますか?

第4

MyClass1 のプロトタイプの "test" プロパティを関数に割り当てていますが、コンストラクターで "test" プロパティを数値に割り当てているため、別のプロパティを使用したい場合があります。

5番目

この行で:

success: callBack.call(this, data)

関数「コールバック」を呼び出しています(どこから来たのかわかりません)、繰り返しますが、コールバックとして設定せずに呼び出しています。関数を呼び出して、コールバックよりも $.ajax を伝えているだけですおそらく「未定義」の「callback.call(this, data)」によって返される値になります。

「コールバック」関数を ajax 請願のコールバックとして設定したい場合は、関数を渡す必要があり、この関数内で、配列が到着したときにやりたいことを何でも行います。この場合は「コールバック」を呼び出しますが、保存する必要があります。 「this」変数を使用するには:

var self = this;
$.ajax({
    url: "test.html",
    success: function(data) {
        callBack.call(self, data);
    }
})

データ変数はajax請願から来ていると思います...

ご覧のとおり、コードがテストされていない場合、正確な応答を返すのは非常に難しいため、次回はコードにフィドルを提供してください。

私の仮定がすべて正しければ、これは必要なコードのようなものです: http://jsfiddle.net/pw3hj/

于 2012-10-08T22:52:27.467 に答える