この質問のタイトルがやや明確であることを願って、私の問題を正確に記入する方法を理解できませんでした。基本的に私は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の内部でそのロジックを配置することだと思う
関数Aは、関数Bが真または偽の応答を返すときにどのようなアクションを取るべきかを決定するため、handleServerResponse()に作業を移行することはできません。場合によっては、メッセージを表示することになりますが、それ以外の場合は異なる場合があります。 – ryandlf
@ryandlf - あなたが私が示唆していることを行うことができるだけでなく、それはほとんど唯一の方法です*。 HTTPリクエストのコールバック内でより複雑なロジックを実行することを妨げるものはありません。そこにメッセージを表示することに限られません。これについてあなたの見解を逆転させる必要があります。イベントに関して考える。リクエストを開始し、完了したらその結果を処理します。あなたが*しないのは、リクエストを開始し、その結果をそれを蹴った同じ機能に戻すことです。これは基本的な同期と非同期の考え方です。 –
他の方法がなぜ機能していなかったのか理解してくれたので、私は受け入れられた答えをあなたに与えなければなりません。ありがとう。 – ryandlf