2011-10-16 4 views
1

私はfolowingコードを持っている:これは動作しない理由をjQueryを使用して関数にajax呼び出しの結果を格納するにはどうすればよいですか?

function checkPermission(user) { 
    var result = 'default'; 
    $.get('/mymodule/checkPermission.php?user=' + user, function(data) { 
     result = data; // does not store data into result, why ? 
     if (result == 'no') { 
      $('.sorry_msg').show(); 
     } 
    }); 
    alert(result); // shows "default". 
    return result == 'yes'; 
} 

あなたは説明できます。問題は、resultに変数dataを保存できません。コードのコメントを参照してください。私は と思われます。それは匿名機能 のためですが、私は何が起こるかを正確に理解するためには十分にjavascriptを知らない。

さらに、またはfalsecheckPermissionに返す方法は、ajax呼び出しの結果に基づいていますか?

+0

Ajaxコールは正確には機能しません。成功のコールバック? 'result'のチェック? HTML要素を表示していますか?これは基本的なデバッグを最初に必要とします –

+0

とにかく、Ajaxの非同期性のために 'result'は周囲の関数には存在しません。 –

+1

クライアント側のパーミッションを確認することは本当に悪い考えです(純粋に美容的でない限り)。 –

答えて

5

ajaxコールバック関数が非同期に実行されるため、期待した結果が得られません。これは、プロセスがajax呼び出しが完了するのを待たないことを意味します。そのため、ajax呼び出しがコールバック関数を実行する前に、外部関数checkPermissionはすでに終了しており、戻り値はajaxコールバックによって変更されていません。

@pinouchon:
私はあなたの提案ソリューションを見てきましたが、これは、それは結果を待つ必要がある時間のために、ブラウザの全体のユーザーインターフェイスをブロックするように私は、同期AJAXリクエストを使用しないことを助言しますajaxリクエスト。私は、あなたの実行戦略を再考し、非同期に実行されるajaxリクエストを中心に構築することをお勧めします。

2

jQueryのget()メソッドはAJAX呼び出しですので、メソッドと非同期です。 get()呼び出しの完了時に呼び出される関数(結果値を変更する関数)は、既存のアラートの後に実行されます。これを試してください:

$.get('/mymodule/checkPermission.php?user=' + user, function(data) { 
    result = data; // does not store data into result. 
    alert("Ajax Complete!"); // NEW ALERT CALL - called upon Ajax Completion 
    if (result == 'no') { 
     $('.sorry_msg').show(); 
    } 
}); 

アラートの順序が「デフォルト」で、「Ajaxが完了しました!」と表示されます。

コールバック関数の目的はすべて、リクエストの完了時にコードを実行できるようにすることです。

関連する問題