非同期のajax呼び出しの仕組みに関する入門書が必要です。
$.post()
に電話すると、ネットワーキングコールが開始され、$.post()
コールからすぐに戻り、残りのJavaScriptを実行し続けます。それはすぐにあなたの機能get_users()
を終了します。
しかし、ajaxコールはまだ行われていません。まだ進行中です。後でajaxコールが終了し、そのときにfunction(response) {...}
と定義されたajaxコールの成功ハンドラが呼び出されます。そのときだけ、後で、ajax呼び出しからの応答値がわかります。
これは非同期のajaxを意味します。あなたはget_users()のような呼び出しを書くことはできませんし、それを使用してユーザーを取得して返すことはできません。代わりに、コールバック関数を使用しなければなりません。コールバック関数は後で呼び出され(ajaxが完了した時点で)、コードのパスを継続できます。はい、これは不便ですが、非同期のajax呼び出しを使用してjavascriptで動作する方法です。非同期のajax呼び出しの利点は、ajax呼び出しの進行中にブラウザと他のjavascriptコードが完全に生きていることです。非同期のajax呼び出しのコストは、それらのコーディングがより複雑であることです。
この複雑さに対処する方法はいくつかあります。まず、get_users()コールを作成してから、get_users()
の内部コールバックで実行したいプログラミングシーケンスを続行するだけで、レスポンス(実際のユーザ)がわかっている唯一の場所です。あなたのコードの1つの場所にget_users()
しか使用していない場合は、正常に動作する可能性があります。それは次のようになります。
function get_users() {
$.post(
url_base + 'travel/trip/get_users/' + trip_id,
function(response) {
// process the user list here and continue whatever other code you
// need that deals with the user list
},
'json'
);
}
あなたは異なる目的のために、いくつかの異なる場所でget_users()
を使用する必要がある場合、あなたは、コールバック自体を取るためにそれを変更し、ポストコールがちょうどその時AJAX呼び出し、そのコールバックを呼び出すさせることができます終わらせる。あなたは、そのコールバック関数で応答のあなたの処理を完了します:
function get_users(callback) {
$.post(
url_base + 'travel/trip/get_users/' + trip_id,
callback,
'json'
);
}
あなたはこのようなget_users()
を呼び出すことができ、この第二の選択肢では:
get_users(function(response) {
// process the user list here and continue whatever other code you
// need that deals with the user list
});
jQuery's deferred objectを使用して、使用可能な、より高度なオプションがあります。
'post'は非同期なので、あなたがしようとしているような値を返すことはできません。これが本当に必要な場合は、アドバイスはしませんが、ajax呼び出しをsynchronous [async:false](http://api.jquery.com/jQuery.ajax/)に設定してください。 – Yoshi
これはスコープの単純な問題ではありません。 AJAX呼び出しは非同期です。ここで何が起きるかは、1. get_usersを呼び出します。これはAjaxリクエストを送信します。 get_usersが完了しました。非常に近い将来、AJAXリクエストが返され、指定したコールバック関数が実行されます(この場合、コールバックは特に面白いことはありません)。 – Asmor