2012-02-20 19 views
6

私はJavaScriptには比較的新しいので、コールバック関数の仕組みを知っていると思っていましたが、Webを検索して2時間も経たないうちに、JavaScriptコールバック関数のローカル変数を設定する

文字列配列を返すAJAXリクエストを作成しています。この配列をローカル変数に設定しようとしていますが、コールバック関数が実行されるとすぐにその値を失うようです。

var array; 

    $.ajax({ 
     type: 'GET', 
     url: 'include/load_array.php', 
     dataType: 'json', 
     success: function(data){ 
      array = data; 
     }, 
     error: function(jqXHR, textStatus, errorThrown){ 
      alert("Error loading the data"); 
     } 
    }); 

    console.debug(array); 

arrayは未定義として表示されます。誰も私になぜこれが設定されていないのか、コールバック関数にローカル変数を設定することができるのかを説明することはできますか?

答えて

7

ここでの問題は、console.logが、ajax呼び出しが非同期で実行されている間に同期的に実行されることです。したがって、コールバックが完了する前に実行されるので、はがまだ実行されていないため、undefinedと表示されます。この作業を行うには、successが完了するまでconsole.logコールを遅らせる必要があります。

$(document).ready(function() { 
    var array; 

    var runLog = function() { 
     console.log(array); 
    }; 

    $.ajax({ 
     type: 'GET', 
     url: 'include/load_array.php', 
     dataType: 'json', 
     success: function(data){ 
     array = data; 
     runlog(); 
    }}); 
}); 
+0

私はあなたがコードのフォーマットに混乱していると思います。 'console.debug'は' ajax'の直後にあります。 –

+0

私はスコープが正しいと信じています。最初の2つの空白以外の行のフォーマットはオフです(左に1つシフトする必要があります)。 – GoldenNewby

+0

@ JamesMontagneあなたは正確です。書式設定は本当に私を捨てました。答えを更新しました。 – JaredPar

2

ajaxの最初のAは非同期です。つまり、配列をデバッグしているうちにまだ結果が出力されていません。配列は、値を表示する時点では定義されていません。あなたはarray.debの下にあるconsole.debugを実行する必要があります。

+0

ヘクタールああ、それは今では明白です!プログラムが実行を継続する前に応答を待つことを保証するために、AJAXに代わる方法がありますか? – Alex

+0

javascriptで同期HTTP呼び出しを行うことはできますが、実行する必要はありません。次回は適切な範囲で結果を作業してください。 – GoldenNewby

+2

これはSJAXです。同期、すなわち、結果が検索されるまで実行はブロックされる。 jsonのリクエストで、async:falseを導入すると、検索は同期的になります。単純な言葉で、前のコードが機能します。しかし、再び、これは悪い習慣です。 GoldenNewbyが指摘しているように、デバッグコードをコールバックの中に置く方法があります。 –

1

success機能はすぐには実行されませんが、HTTP応答が到着した後にのみ実行されます。したがって、この時点でarrayはまだundefinedです。 HTTP応答データに対して操作を実行する場合は、success関数内から実行するか、関数内でその操作を定義してから、successコールバック内からその関数を呼び出します。

0

AJAXは非同期です。 array変数を設定していますが、それ以降はdebugが実行されます。 AJAX呼び出しを行うと、リクエストが送信されますが、コード内で処理が続けられます。後で、要求が返され、successまたはerror関数が実行されます。

1

はあなたsuccess後にこの変数を設定する関数を呼び出してみてください。

var array; 

var goodToProceed = function(myArr) { 
    console.debug(myArr); 
}; 

$.ajax({ 
type: 'GET', 
url: 'include/load_array.php', 
dataType: 'json', 
success: function(data){ 
    goodToProceed(data); 
}, 
error: function(jqXHR, textStatus, errorThrown){ 
    alert("Error loading the data"); 
} 
}); 
+2

なぜ成功したときに直接呼び出されるのではなく、goodToProceedを呼び出す無名関数を作るのはどうですか? – GoldenNewby

+0

はいGoldenNewby、良い点。私はそれを頻繁に行うが、確かにそれをする必要はない。 – adis

+0

@adis、時にはコードを解くのが良いですが、その場合には無名関数は必要ありません。 'success:goodToProceed、'を定義するだけです – stivlo

関連する問題