Возвращение логического значения из одной функции должно влиять на другую - PullRequest
0 голосов
/ 30 октября 2011

Надеюсь, заголовок этого вопроса несколько ясен, я не мог понять, как точно изложить мою проблему.В основном у меня есть 3 функции.

Функция 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 (имя пользователя) для получения возвращенного логического значения true или false и определения необходимости отображения положительного или отрицательного ответа.

Функция B (checkData (username)):

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 возвращает логическое значение, но как мне также вернуть это логическое значение обратно в функцию B, чтобы функция A могла получить ответ?Я пытался:

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

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

Но это не работает должным образом.Я также думал о том, чтобы установить глобальную переменную, например, serverResponse = true, и затем вернуть этот ответ из функции B, но другие объекты также используют эту функцию, поэтому мне потребуется способ ее сброса после каждого использования.

Ответы [ 3 ]

1 голос
/ 30 октября 2011

Думаю, вам лучше всего удалить функцию A и поместить ее логику в функцию C:

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 голосов
/ 30 октября 2011

AJAX-вызовы являются асинхронными, поэтому функция checkData () сразу возвращается, не дожидаясь ответа сервера. Когда приходит ответ, он вызывает функцию handleServerResponse (), передавая ему ответ.

Я предлагаю вам переместить проверки validUsername () в handleServerResponse (), чтобы убедиться, что вы получите правильный ответ.

0 голосов
/ 30 октября 2011

Возвращаемое значение функции, выполняемой асинхронно, бесполезно.Вам нужно выполнить работу, которую вы выполняете в validUsername в обратном вызове или в функции, которую вызывает обратный вызов.Как написано, вы пытаетесь использовать checkData так, как если бы он был синхронным, но в принципе это не так, поскольку он выполняет асинхронный HTTP-запрос.Перенос работы в обратный вызов onreadystatechange решает вашу проблему.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...