4

getJSON()後で使用するために、取得したデータを配列にどのように割り当てますか?

以下の getJSON url は、適切にフォーマットされた 10 個のメイン要素を持つ JSON を取得します。各要素には、id、username、haiku (およびその他) のサブ要素があります。実行している場合は、JSON 要素をローカル ファイルに保存してみてください。そうすれば、同じドメイン エラーが発生しなくなります (つまり、別のドメインから取得している場合、JSON は読み込まれません)。

何が起こるかというと、アラートはgetJSONコールバック内で値を取得しますが、外部では値は未定義です。


$(document).ready(function(){
    var haikus=[];
    alert("begin loop");
    $.getJSON('http://example.com/json.php',function(data){
         var i=0;
         for(i=0;i<data.length;i++){
            haikus[i]=[data[i].id,String(data[i].username),String(data[i].haiku)];
        }
            alert(haikus[0][1]);
    });
})

  • はい、これは以前の投稿に関連しています。しかし、最初は問題を単純化しすぎたため、提供された最初のソリューションでは解決しませんでした。jQuery - getJSON データを配列に
4

2 に答える 2

20

あなたの問題は、リクエストの外側(およびその後)のコードは、レスポンスが受信$.getJSONされるまでにすでに実行されていることです。$.getJSON

AJAX 呼び出しは非同期であることに注意してください。これは、AJAX 要求に続くコードが応答の実行を待たないことを意味します。そのため、応答があるまでずっと実行されます。

重要なのは、非同期 AJAX 要求からの応答に依存するすべてのコードは、コールバック内で実行 (または呼び出し) する必要があるということです。


編集:

明確にするために、以下のコード例のコード コメントを参照してください。問題の説明に役立つはずです。

$(document).ready(function(){
    var haikus=[];
    alert("begin loop");
    $.getJSON('http://haikuennui.com/random.php',function(data){
         var i=0;
         for(i=0;i<data.length;i++){
            haikus[i]=[data[i].id,String(data[i].username),String(data[i].haiku)];
        }
                 // The data in haikus is available here becuase
                 //    this alert() doesn't run until the response is received.
            alert(haikus[0][1]);
    });

         // Here the data in haikus is NOT available because this line
         //     of code will run ***before*** the response from the AJAX
         //     request from above is received.
         // In other words, this alert() executes **immediately** without
         //     waiting for the $.getJSON() to receive its response.
    alert(haikus[0][1]);

});
于 2010-08-09T17:53:41.000 に答える
0

「var haikus = something」を使用して変数を定義すると、変数はローカル スコープになり、「haikus = something」を使用して変数を定義すると、グローバル スコープになると思います。

于 2010-08-09T17:25:08.837 に答える