2011-12-19 11 views
1

おそらくあなたには明らかですが、わかりません。内部関数の値を返す関数を作る方法は?

内部関数の値を返す関数を作成する必要があります。つまり、JSONオブジェクトを返さなければならない関数get_users()があります。そのJSONオブジェクトには$.post(jQueryが組み込まれています)があります。

function get_users() {  
    return 
     $.post(
      url_base + 'travel/trip/get_users/' + trip_id, 
      function(response) {  
       return response;  
      }, 
      'json' 
     );  
} 

(上記は私がしようとしたものですが、それは undefinedを返された - どのような驚き)ので、変数のスコープの

、それは表示されませんので、私はちょうど関数内で変数を作ることができません主な機能です私はグローバル変数を使いたくない。より良い解決策を探して!

アドバイスありがとうございます!

+0

'post'は非同期なので、あなたがしようとしているような値を返すことはできません。これが本当に必要な場合は、アドバイスはしませんが、ajax呼び出しをsynchronous [async:false](http://api.jquery.com/jQuery.ajax/)に設定してください。 – Yoshi

+1

これはスコープの単純な問題ではありません。 AJAX呼び出しは非同期です。ここで何が起きるかは、1. get_usersを呼び出します。これはAjaxリクエストを送信します。 get_usersが完了しました。非常に近い将来、AJAXリクエストが返され、指定したコールバック関数が実行されます(この場合、コールバックは特に面白いことはありません)。 – Asmor

答えて

2

非同期の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を使用して、使用可能な、より高度なオプションがあります。

5

なぜAJAXの非同期性と戦っていますか? AJAXを実行するときは、シーケンシャルコードを記述するのではなく、イベントやコールバックを操作するのに慣れておく必要があります。内部のコンテンツは返却できません。この単純な理由は、この内部関数が外部関数よりもずっと遅く実行できることです。そのため、外部関数は、成功コールバックが実行されるよりもずっと前に結果を返します。

だからここに正しい方法です:

function get_users() { 
    $.post(
     url_base + 'travel/trip/get_users/' + trip_id, 
     function(response) { 
      // instead of trying to return anything here 
      // simply do something with the response 
      // Depending on what the server sent you there 
      // will be different ways. 

      // Here you could also call some other custom function 
      // and pass it the response 
     } 
     'json' 
    ); 
} 
+0

私はちょうど学んでいる...例は非常に高く評価されるだろう。 – daGrevis

+0

@daGrevis、確かに、私は例で私の答えを更新しました。 –

3

あなたは、AJAX呼び出しから値を返すことはできません。あなたは、内側のリターンを打つ時まで(偽非同期設定せずに、それは本当にAJAXではないでしょう)

、外側の関数は、すでにあなたがユーザーを処理するためにコールバックを使用する必要があります

を完了しました。

get_users(function(response) { // this anonymous function is passed in as a parameter 
    // do something with the response 
}); 

function get_users(callback) { 
    $.post(
     url_base + 'travel/trip/get_users/' + trip_id, 
     function(response) { 
      // call the passed in function and pass in the response as a parameter 
      callback(response);  
     }, 
     json' 
    ); 
} 
+0

*追加の作業*が必要ない場合は、2回目の無名関数を使わずに 'callback'を直接使うことができます。 :) – Yoshi

関連する問題