1

JavaScript オブジェクト (クラス) のメソッド間でデータを交換する際に小さな問題があります。

var TEST = (function () {

    var TEST = function() {

    };

    TEST.prototype.get = function() {
        $.ajax({
            type: "GET",
            url: "http://test.com/getall",
            dataType: "json",
            success: function (data) {
                return data;  // if i console log this i will get a json obj
            }
        });
    };

    TEST.prototype.parse = function(data) {
        $.each(this.get(), function(k, v){
            console.log(v);
        });
    };

    return TEST;
})();

そのため、別のメソッドの各ステートメントで 1 つのメソッドを呼び出そうとしています。問題はそれです

応答はundefinedです。

私もこのように試しましたが、彼は同じ結果でした

var testing = new TEST();
var get = testing.get();
testing.parse(get);

私は何が欠けていますか?this.getで使用するデータを から返すにはどうすればよいですかthis.parse

ありがとう

4

2 に答える 2

1

通常の実行フローの外で結果を返す非同期呼び出しに依存しているため、この方法で関数を構築することはできません。.get関数の結果を実際に受け取る唯一の方法は、コールバックを使用することです。

簡単に言えば、値は.get関数から返されるのではなく、jQuery の.ajaxメソッドに渡すコールバックから返されます。

非同期を無効にするよりも、非同期呼び出しを引き続きサポートするようにコードを再設計する方がはるかに良いでしょう。

大まかなアイデアは、次のように解析関数を変更することです。

TEST.prototype.parse = function(data) {
    this.get(function(result){
        $.each(result, function(k, v){
            console.log(v);
        });
    });
};

それに応じて get 関数を変更するには:

TEST.prototype.get = function(callback) {
    $.ajax({
        type: "GET",
        url: "http://test.com/getall",
        dataType: "json",
        success: callback
    });
};

上記は簡単な例です。次の jQuery トピックをよく読んでください。

プロミス パターンに基づいてコードを設計すると、最初は複雑に感じるかもしれませんが、コードに多くの機能が追加され、ajax 呼び出しを処理するときに発生する可能性のあるコールバック スタックの狂気全体を回避できます。

ドキュメントから完全には明らかではありませんがjQuery.ajax、この関数はjqXHRpromise インターフェイスを実装するオブジェクトを返します。doneしたがって、これは promise メソッド、alwaysおよびを使用できることを意味しますfail

于 2013-01-10T08:46:15.073 に答える
1

$.ajax()デフォルトでは非同期です。つまり、関数の実行はget()、リクエストが完了するまで待機しません。したがって、そこから値を返さないため、値undefinedが返されます。

関数がget()値を返せるようにするには、リクエストを同期的に実行し、外側の関数に変数を設定する必要があります (成功自体は別の関数であり、戻り値はキャッチされません)。

TEST.prototype.get = function() {
        var result;

        $.ajax({
            type: "GET",
            url: "http://test.com/getall",
            async: false, // this is the important part!
            dataType: "json",
            success: function (data) {
                result = data;  
            }
        });

        return result;
    };

編集

@pebbl が述べたように、これにより、リクエストが完了するまで、すべてのスクリプトの実行が停止します。したがって、当面の間、ページ全体がブロックされます。

一般的なアプローチは、そのような場合にコールバックを使用することです。コールバックは、リクエストが完了すると実行されます。したがって、あなたの場合は次のようになります。

TEST.prototype.get = function( cb ) {
        $.ajax({
            type: "GET",
            url: "http://test.com/getall",
            dataType: "json",
            success: function (data) {
                cb( data );
            }
        });
    };

後で次のように呼び出します。

var testing = new TEST();
testing.get( function( data ) { 
  testing.parse( data );  
});
于 2013-01-10T08:46:33.160 に答える