3

簡単に言うと、AJAX を返す JSON から対応するデータ値をこれらのグローバル配列に格納しようとしています。AJAX 内にアラートを配置したため、配列が正しく構築されていることはわかっていますが、AJAX の外に配置すると、配列はまだ定義されていません。

popData JSON オブジェクト全体をエクスポートして動作させ、値をグローバル配列に保存するか、AJAX で配列のデータを取得して呼び出しの外で実行するにはどうすればよいですか? 人口値をユーザーが選択した狭い範囲の値と比較するために、これらの配列に別の関数からアクセスできるようにする必要があります。すでに HTML で行われています。これは、サーバーでの AJAX 呼び出しを最小限に抑えてそれを行うための最も合理的な方法だと思いますが、提案は受け付けています。:D

    var popProducers = new Array();
    var popProducersCount = new Array();


    function getPopulationInfo(){

        $.ajax({
            url:phpURL,
            cache:false,
            dataType:"json",
            data: { },
            success:function(popData){

                for (i=0;i<popData.length;i++){

                    //producers and producersCount should be the same length at all times!
                    //If current producer name isn't in array already
                    if(popProducers.indexOf(popData[i].ProducerName) == -1){
                        //add new element to represent new producer quantity (producerCount.length returns number of elements in the array, thus if there are no elements = 0 thus making index 0 equal to 1 and so on)
                        popProducersCount[popProducersCount.length] = 1;
                        //Adds the producer name to the list of producers
                        popProducers[popProducers.length] = popData[i].ProducerName;
                    } else {
                        //Otherwise, it will increment the index of the producersCount array corresponding with the pre-existing producer name's index by 1
                        popProducersCount[popProducers.indexOf(popData[i].ProducerName)] += 1;
                    }


                }

            }
        });

        alert("Population Data Alert: " + popProducers);
4

1 に答える 1

4

.ajax()およびその下にあるものは、デフォルトで非同期リクエストをXMLHttpRequest()作成します。つまり、ステートメントがハンドラーの前にあるということです。alert()success

ここでの簡単な解決策は、それを一番下alert()のハンドラーに移動することです。success

より適切な方法で処理したい場合は、次のような方法で jQuerysDeferredオブジェクトを使用できます。

function getPopulationInfo(){
    return $.ajax({
       // lots of stuff
    });
 }

そしてそれを次のように呼び出します

getPopulationInfo().done(function() {
    alert("Population Data Alert: " + popProducers);
});

.ajax()メソッドを返すことにより、暗黙的に a を返しますDeferred objectsuccess簡単に言うと、 (.done())、 error(.fail())、およびcomplete(.always())の追加のコールバックを渡すことができます。

于 2012-07-30T18:26:31.213 に答える