2011-10-30 19 views
0

この質問のタイトルがやや明確であることを願って、私の問題を正確に記入する方法を理解できませんでした。基本的に私は3つの機能を持っています。1つの関数からBooleanが返されなければならない

機能A:

function validUsername(){ 
if(username.element.value.length > 0){ 
    if(checkData(username)){ 
     showMessage(username, true); 
    }else{ 
     showMessage(username, false, 'Username Already In Use'); 
    } 
} 
} 

基本的には、このフィールドには、ユーザ名がすでにデータベースに存在しないことを確認するために、AJAXを使用しています。 checkData(username)を使用して返されるtrueまたはfalseのブール値を取得し、肯定応答または否定応答を表示する必要があるかどうかを判断します。

関数B(CHECKDATA(ユーザ名)):

function checkData(obj){ 
var field = getFieldValue(obj.container); 

if(field.length != 1){ 
    field = null; 
} 

if(xmlObj != null) { 
    xmlObj.open("POST", obj.servletUrl, true); 
    xmlObj.onreadystatechange = function() { handleServerResponse(obj.container); }; 
    xmlObj.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded'); 
xmlObj.send("field=" + field); //Post username to Servlet 
} 
} 

これは、要求の準備ができたときなどAJAXリクエストを作成する責任があるバック画面にメッセージを表示するhandleServerResponseを使用しています。

関数C(handleServerResponse):

function handleServerResponse(container){ 
var response = xmlObj.responseText; 
if(xmlObj.readyState == 4) { 
    if(xmlObj.status == 200){ 
     if(response.indexOf('null') != -1){ 
      return true; 
     }else{ 
      return false; 
     } 
    } 
} 
} 

機能Cはブール値を返しますが、その機能Aが応答を受信することができますので、どのように私はまた、機能Bに戻ってそのブール値を返すのですか?私は試しました:

xmlObj.onreadystatechange = function() { return handleServerResponse(obj.container); 

return xmlObj.onreadystatechange; //Function B would return this. 

しかし、正しく動作しません。また、serverResponse = trueのようなグローバル変数を設定し、その応答を関数Bから返すことも考えましたが、他のオブジェクトもこの関数を使用していますので、使用するたびにリセットする必要があります。私はあなたの最善の策は、関数Aを削除し、機能Cの内部でそのロジックを配置することだと思う

答えて

0

非同期に実行される関数の戻り値は無駄です。 validUsernameのコールバックの作業や、コールバックが呼び出す関数を実行する必要があります。書かれているように、checkDataを同期しているかのように使用しようとしていますが、非同期HTTP要求が出るため基本的にはそうではありません。問題を解決するには、コールバックに作業を移行します。

+0

関数Aは、関数Bが真または偽の応答を返すときにどのようなアクションを取るべきかを決定するため、handleServerResponse()に作業を移行することはできません。場合によっては、メッセージを表示することになりますが、それ以外の場合は異なる場合があります。 – ryandlf

+0

@ryandlf - あなたが私が示唆していることを行うことができるだけでなく、それはほとんど唯一の方法です*。 HTTPリクエストのコールバック内でより複雑なロジックを実行することを妨げるものはありません。そこにメッセージを表示することに限られません。これについてあなたの見解を逆転させる必要があります。イベントに関して考える。リクエストを開始し、完了したらその結果を処理します。あなたが*しないのは、リクエストを開始し、その結果をそれを蹴った同じ機能に戻すことです。これは基本的な同期と非同期の考え方です。 –

+0

他の方法がなぜ機能していなかったのか理解してくれたので、私は受け入れられた答えをあなたに与えなければなりません。ありがとう。 – ryandlf

1

:あなたはどちらか非同期的にそれらを作るために持っているので

function handleServerResponse(container){ 
    var response = xmlObj.responseText; 
    if(xmlObj.readyState == 4) { 
    if(xmlObj.status == 200){ 
     if(response.indexOf('null') != -1){ 
      showMessage(username, true); 
     }else{ 
      showMessage(username, false, 'Username Already In Use'); 
     } 
    } 
    } 
} 

ことが困難AJAXから値を返すようにした場合は、呼び出して、どの種類私が上に示したように、目的を破ったり、返信ハンドラで必要なロジックを処理しなければなりません。

+0

これは私が今セットアップした方法ですが、代替応答を設定するために関数Aを使用できる必要があるため、私はそれを好きです。このコードは、常に単にshowMessageを返すわけではありません。関数Aは、どのような応答を取るべきかを決定するためのものです。 – ryandlf

0

AJAX呼び出しは非同期であるため、関数checkData()はサーバーの応答を待つことなくimmediatlyに戻ります。応答が到着すると、応答を渡すhandleServerResponse()関数を呼び出します。

handleServerResponse()のvalidUsername()チェックを移動して、正しい答えを得られるようにすることをお勧めします。

関連する問題