Ver Mensaje Individual
  #2 (permalink)  
Antiguo 20/04/2018, 11:15
Avatar de Alexis88
Alexis88
Philosopher
 
Fecha de Ingreso: noviembre-2011
Ubicación: Tacna, Perú
Mensajes: 5.552
Antigüedad: 12 años, 5 meses
Puntos: 977
Respuesta: Problema al devolver resultado de una funcion

Como AJAX es un modelo de comunicación asincrónico, tienes tres opciones para resolver esto:

1. El tercer argumento del método .open() debe ser false para que la operación se vuelva sincrónica:

Código Javascript:
Ver original
  1. ajax.open("POST", "http://localhost:8080/Front/CompruebaNombreUsuario", false);

2. Utiliza una promesa:

Código Javascript:
Ver original
  1. function rellenaLista(){
  2.     var nombreUsuario = document.getElementById("nameUser").value,
  3.         ajax = nuevoAjax();
  4.  
  5.     return new Promise(function(exito, error){
  6.         ajax.open("POST", "http://localhost:8080/Front/CompruebaNombreUsuario", true);
  7.         ajax.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
  8.         ajax.send(busqueda);
  9.         ajax.onreadystatechange = function(){  
  10.             if (ajax.readyState == 4 && ajax.status == 200){
  11.                 exito(ajax.responseText);
  12.             }
  13.         }
  14.     });
  15. }
  16.  
  17. rellenaLista().then(function(respuesta){
  18.     if (!respuesta){
  19.         alert("El nombre de usuario que ha elegido no esta disponible. Por favor eliga otro para ver si esta disponible para usted.");
  20.         return false;
  21.     }
  22. });

3. Utiliza un callback o llamada de retorno:

Código Javascript:
Ver original
  1. function rellenaLista(callback){
  2.     var nombreUsuario = document.getElementById("nameUser").value,
  3.         ajax = nuevoAjax();
  4.  
  5.     ajax.open("POST", "http://localhost:8080/Front/CompruebaNombreUsuario", true);
  6.     ajax.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
  7.     ajax.send(busqueda);
  8.     ajax.onreadystatechange = function(){  
  9.         if (ajax.readyState == 4 && ajax.status == 200){
  10.             callback(ajax.responseText);
  11.         }
  12.     }
  13. }
  14.  
  15. rellenaLista(function(respuesta){
  16.     if (!respuesta){
  17.         alert("El nombre de usuario que ha elegido no esta disponible. Por favor eliga otro para ver si esta disponible para usted.");
  18.         return false;
  19.     }
  20. });

Simplifiqué la parte en la que retornas la respuesta ya que, un resultado 0, también es interpretado como false; mientras que, un resultado mayor a 0, es interpretado como true. De allí que se envíe la respuesta obtenida desde el servidor para determinar si es true (mayor a cero, se puede usar el nombre de usuario) o false (igual a cero, no se puede usar el nombre de usuario).

Aunque creo que esto último en realidad debe ser al revés, es decir, si se obtiene una o más coincidencias en la base de datos, no se debe permitir usar el nombre de usuario y, si no se obtiene ninguna coincidencia, se debe permitir usar el nombre de usuario, decidí dejarlo como lo vienes usando porque no estoy seguro de qué información recibes desde el servidor.

__________________
«Juro por mi vida y mi amor por ella, que jamás viviré para el provecho de otro hombre, ni le pediré a otro hombre que viva para el mío».

Ayn Rand