2011-07-09 10 views
4

このアラートが空である理由を誰かに教えてもらえますか?JavaScript可変スコープに関する質問

var pending_dates = []; 
$.getJSON('/ajax/event-json-output.php', function(data) { 
    $.each(data, function(key, val) { 
    pending_dates.push({'event_date' : val.event_date}); 
    }); 
}); 
alert(pending_dates); 

私はこれを回避することはできません。私はpending_datesをグローバル変数として宣言しておらず、各ループ内でアクセス可能ですか?どのようにこれを解決するだろうか?

JSON出力がうまく機能していることに注意してください。もし私がgetJSON functionの中で保留中の日付を宣言すると(その機能内に警告する)、それは機能しますが、そのデータはgetJSONの外の配列に格納する必要があります。

あなたの貢献に感謝します。

EDITこのコードが動作しているあなたのコメントへ

ありがとう:

pending_dates = []; 
    $.getJSON('/ajax/event-json-output.php', function(data) { 
     $.each(data, function(key, val) { 
      pending_dates.push({'event_date' : val.event_date}); 
     }); 
    }).success(function() { alert(pending_dates); }) 

おかげであなたの貢献のために多くのことを! varを持つことは、実際にスコープを紹介 -

答えて

4

私はこの問題は$.getJSONが非同期呼び出しであると思います。すぐに戻り、alert(pending_dates)が呼び出されます。それが起こるとき

しかし、非同期呼び出しからの応答が受信されていない可能性があり、したがってpending_datesが移入されていなくてもよいです。それはalert(pending_dates)が呼び出された時点で空である理由は、おそらくです

-2

変数は、JavaScriptで、デフォルトではグローバルです。それを削除し、それが役立つかどうかを確認してください。

+0

あなたの答えをありがとうが、それは私が恐れることはありません。他のアイデア? – maartenmachiels

+0

変数の定義とアラートは同じスコープにあるため、この提案は問題とは関係ありません。 – jfriend00

-2

これは、AJAXの応答は、任意のデータを返すされていない可能性が高いです。 'foo'を配列に押し込んでみて、アラートに何か違うものが表示されていないかどうか確認できますか?

+0

AJAXの回答がデータを返すという質問には... – HoLyVieR

+0

これはあまりありません。はい、可能ですが、説明されている問題は、ajax呼び出しの非同期の性質によるものです。 – tomfumb

3

JSON呼び出しが完了する前にアラートが実行されています。非同期にフェッチして処理したJSONを覚えていますが、アラートは開始直後に発生します。アラートが必要な場合は、getJSON呼び出しの完了時にそれを置く必要があります。

2

$.getJSONは、コールバックで指定したものは最終的に実行されますが、alert('pending_dates')に到達するまでに発生する保証はありません。

あなたは(これは、それが取得された各項目に表示されている1つのアラートにつながる)
pending_dates.push()alert('pending_dates')権を移動することでこれを確認することができます。あなたはそれとして取得するすべてのデータを扱うことができるようになります

var pending_dates = []; 
$.getJSON('/ajax/event-json-output.php', function(data) { 
    $.each(data, function(key, val) { 
     pending_dates.push({'event_date' : val.event_date}); 
     doSomething(val.event_date); 
    }); 
}); 

function doSomething(date) { 
    // do something with date 
    // like writing it to the page 
    // or displaying an alert 
} 

これにより:

あなたは、すぐにそれが利用可能であるとして取得しているデータで作業を開始する機能を書くことができます利用可能になる。

関連する問題