0

アプリで行わなければならない多数の JSON 呼び出しを処理するための単純なユーティリティを作成していますが、以下の readJson 関数の問題は、Ajax を取得する内部関数がデータを取得する前に完了するため、undefined が返されることです。 . 誰かがこの問題に対する既存の回答を教えてくれますか、または Ajax リクエストが完了するまで返されないようにこの関数をより適切に構造化する方法についてアドバイスを提供できますか?

json_manager = { 
    thisJson:'',
    readJson:function(theFileName, thePathName) {

        var theUrl=(thePathName+theFileName);
        $.getJSON(theUrl).done(function(theJSON) { 
                json_manager.thisJson=theJSON;
        });
        return(json_manager.thisJson)
    },
        //more functions 
    }
4

2 に答える 2

1

関数が戻る前に ajax 呼び出しが終了するようにシリアル化できる唯一の方法は、ajax 呼び出しを同期させることです。また、ブラウザがロックされて ajax 呼び出し中にイベントが処理されず、エンド ユーザーにとって非常に悪いユーザー エクスペリエンスが頻繁に発生するため、これはお勧めできません。そのようにしないでください。

それ以外では、AJAX の「A」は非同期を表し、AAX 呼び出しの結果を必要とする作業を実行するには、コールバックを使用して非同期方式でプログラミングする方法を学ぶ必要があります。Ajax は通常非同期であるため、readJson()関数は ajax 呼び出しが完了する前に戻ります。したがって、その関数で ajax 呼び出しの結果を返すことはできません。

非同期 ajax で動作するようにコードを再構築するには、結果を必要とするすべての作業をコールバックに移動し$.getJSON()、ajax 呼び出しの成功/完了ハンドラーからの引数として結果を使用してそのコールバック関数を呼び出す必要があります。

次のようにできます。

json_manager = { 
    thisJson:'',
    readJson:function(theFileName, thePathName, successHandlerFn) {

        var theUrl=(thePathName+theFileName);
        $.getJSON(theUrl).done(function(theJSON) { 
                successHandlerFn(theJSON);
        });
    },
        //more functions 
}
于 2013-09-07T17:38:27.947 に答える
1

古典的な非同期の問題に直面しています。何が起こっているかというと、$.getJSON呼び出しはサーバーへの呼び出しをセットアップするだけです。現在実行中の関数が制御をブラウザに返すまで、実際には呼び出しを実行しません。

この状況では、データを要求するのではなく、データの行き先を示すようにコードを構成する必要があります

このようなもの:

json_manager = { 

    readJson:function(theFileName, thePathName, callback) {

        var theUrl=(thePathName+theFileName);
        $.getJSON(theUrl).done(callback);

    },
        //more functions 
}

次に、次のように呼び出すことができます。

json_manager.readJson('file', 'path', function(data) {
   // do something with the returned json
});

このようにreadJsonして、サーバーから取得したデータをどう処理するかについての指示を関数に提供します。

于 2013-09-07T17:40:26.177 に答える