0

バックエンド アクションの内容を含む JSON blob を返す MVC コントローラーを呼び出す関数があります。この JSON BLOB は、エンド ユーザーに表示されるテーブルに入力するために使用されています。

私の関数は現在、次のようになっています。

function getJsonFromController(path) {
    var blob = null;

    $.getJSON(path, function (data) {
        blob = data;
        console.log('inside getjson : ' + blob);
    });

    console.log('outside getjson : ' + blob);
    return blob;
}

...そして、次のような呼び出しアクション:

$('#action-button').click(new function () {
    blob = getJsonFromController('A/B?pageId=1');

    console.log('in click event: ' + blob);
    $.tmpl($template, blob).appendTo($('#table-body'));
});

これを呼び出す Web ページ/アクションを実行すると、指定された順序で次の結果が得られます。

outside getjson: null
in click event: null
inside getjson: [object Object] 

他の構成 (.getJSON() の .complete、$.getJSON() から値を直接返す) を試みて、コールバックからの「データ」を外側のスコープの blob 変数にエコーしようとしましたが、これまでのところ、ブロブは getJSON コールバック内でのみ値を持つように見えます。

そうは言っても、JavaScript はレキシカル スコープの言語であることも認識しているため、すべての匿名関数チェーンが実行される可能性があります。

質問: 私の blob が $.getJSON 内に正しく表示されていることがわかります。では、ブロブを取り出すにはどうすればよいでしょうか。

4

1 に答える 1

1

AJAX リクエストは非同期です。同期的に行うこともできます (リクエストが完了するまで Web ページがフリーズすることに注意してください)。

function getJsonFromController(path) {
    var blob = null;

    $.getJSON(path, function (data) {
        blob = data;
        console.log('inside getjson : ' + blob);
        $.tmpl($template, blob).appendTo($('#table-body'));
    });
}

そしてクリック:

$('#action-button').click(new function () {
    blob = getJsonFromController('A/B?pageId=1');
});
于 2012-09-25T20:54:16.170 に答える