Foros del Web » Programando para Internet » Javascript »

[SOLUCIONADO] Problema al devolver resultado de una funcion

Estas en el tema de Problema al devolver resultado de una funcion en el foro de Javascript en Foros del Web. Buenas a tod@s, tengo un problema en JS que al devolver el resultado de una funciona me devuelve "undefined". Le ha dado varias vueltas y ...
  #1 (permalink)  
Antiguo 20/04/2018, 07:50
 
Fecha de Ingreso: octubre-2013
Mensajes: 79
Antigüedad: 10 años, 5 meses
Puntos: 1
Problema al devolver resultado de una funcion

Buenas a tod@s,

tengo un problema en JS que al devolver el resultado de una funciona me devuelve "undefined".

Le ha dado varias vueltas y buscado soluciones pero no veo donde esta el problema. No se si puede ser porque la funcion al ser una consulta por AJAX al servidor, ahi influye en que el return no devuelve lo que debería.
Si me podeis echar una manilla os lo agredeceria mucho.

Adjunto el codigo:


function rellenaLista()
{
var nombreUsuario=document.getElementById("nameUser"). value;


/* Si se necesita verificar la base de datos, guardo el patron de busqueda con el que se
busco y luego recibo en una variable si existen mas resultados de los que se van a mostrar */
var busqueda = "usuario="+nombreUsuario;

// hago la consulta con AJAX a la base de datos a ver si existen coincidencias
var ajax=nuevoAjax();
ajax.open("POST", "http://localhost:8080/Front/CompruebaNombreUsuario", true);
ajax.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");

ajax.send(busqueda);

ajax.onreadystatechange=function()
{
if (ajax.readyState==4)
{

var respuesta=ajax.responseText;

// Si se obtuvieron datos los muestro
if(respuesta==0)
{alert("El nombre de usuario que ha elegido no esta disponible. Por favor eliga otro para ver si esta disponible para usted.");
return false; }
else{
return true; }
}

}
}


-------------------------------------------------------

Y en otra parte del codigo cuando llamo a esa funcion, la declaro asi:

var comprobacion=rellenaLista()
alert(comprobacion)
if(comprobacion==false){return false;}

*(aunque en esta parte del codigo he probado de todo. Y bueno con la función tambien he probado varias cosas)

-------------------------------------------------------



P.D. siento no haber puesto el codigo formateado, hace mucho que no publicaba aqui y no me acordaba que tenia que formatearlo al publicar el mensaje, me temo que editandolo ya no me permite formatearlo.

Muchas gracias de antemano.

Saludos

Última edición por sentoki79; 20/04/2018 a las 08:22
  #2 (permalink)  
Antiguo 20/04/2018, 11:15
Avatar de Alexis88
Philosopher
 
Fecha de Ingreso: noviembre-2011
Ubicación: Tacna, Perú
Mensajes: 5.551
Antigüedad: 12 años, 4 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
  #3 (permalink)  
Antiguo 20/04/2018, 12:19
 
Fecha de Ingreso: octubre-2013
Mensajes: 79
Antigüedad: 10 años, 5 meses
Puntos: 1
Respuesta: Problema al devolver resultado de una funcion

He probado con las 3 soluciones que me has aportado, me temo que no han funcionado.

Con la de la promesa me recoge un object promise cuando llamo a la funcion para comprobar si la respuesat es true o false. No me refiero a la funcion que hace referencia la promesa. Sino en esta linea de codigo llamada desde otra parte del codigo cuando estoy comprobando antes de enviar y el formulario si estan todos los campos correctamente :

Código:
  var respuesta2=rellenaLista()
   alert(respuesta2)
  if(respuesta2==0){return false;}
Tambien he probado con la de hacer un callback, pero desde esa linea que acabo de mostrar no tengo forma de pasar un parametro en la llamada de la funcion.


Muchas gracias por las soluciones.

Saludos
  #4 (permalink)  
Antiguo 20/04/2018, 13:03
Avatar de Alexis88
Philosopher
 
Fecha de Ingreso: noviembre-2011
Ubicación: Tacna, Perú
Mensajes: 5.551
Antigüedad: 12 años, 4 meses
Puntos: 977
Respuesta: Problema al devolver resultado de una funcion

Para usar las dos soluciones del final, es necesario que reescribas esa parte de tu código de la forma en la que se muestra en los ejemplos de arriba.

En lugar de esto:

Código Javascript:
Ver original
  1. var respuesta2=rellenaLista()
  2. alert(respuesta2)
  3. if(respuesta2==0){return false;}

Debe ser así para la promesa:

Código Javascript:
Ver original
  1. rellenaLista().then(function(respuesta){
  2.     if (!respuesta){
  3.         alert("El nombre de usuario que ha elegido no esta disponible. Por favor eliga otro para ver si esta disponible para usted.");
  4.         return false;
  5.     }
  6. });

Y así para el callback:

Código Javascript:
Ver original
  1. rellenaLista(function(respuesta){
  2.     if (!respuesta){
  3.         alert("El nombre de usuario que ha elegido no esta disponible. Por favor eliga otro para ver si esta disponible para usted.");
  4.         return false;
  5.     }
  6. });

Así, tal como lo ves, sin el var respuesta2. Solo lo que se muestra.

----------------------------

Por otro lado, para este tipo de problemas en los que se ejecutan procesos asincrónicos, es preferible evitar el uso de devolución de respuestas mediante la sentencia return (error mío al elaborar el ejemplo con dicha sentencia) y, en su lugar, apoyarse en el trabajo con promesas o callbacks.

Dicho esto, lo deseable sería trabajar de una manera similar a esta:

Código Javascript:
Ver original
  1. function nuevoUsuario(nombre){
  2.     verificarDisponibilidad(nombre).then(function(respuesta){
  3.         if (!respuesta){ //Cero equivale a "false"
  4.             registrarNombre(nombre);
  5.         }
  6.         else{
  7.             alert("El nombre ya se encuentra registrado");
  8.         }
  9.     });
  10. }
  11.  
  12. function verificarDisponibilidad(nombre){
  13.     return new Promise(function(exito, error){
  14.         var xhr = new XMLHttpRequest();
  15.  
  16.         xhr.open("GET", "verificar.php?nombre=" + nombre);
  17.         xhr.send();
  18.         xhr.addEventListener("load", function(){
  19.             if (this.status == 200){
  20.                 exito(this.responseText); //La respuesta será el número de coincidencias del nombre en la base de datos
  21.             }
  22.         }, false);
  23.     });
  24. }
  25.  
  26. nuevoUsuario("sentoki79");

Así nos olvidamos de los return y trabajamos utilizando las bondades del desarrollo actual de ECMAScript.

__________________
«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

Última edición por Alexis88; 20/04/2018 a las 13:23 Razón: El "return" no es aconsejable en procesos asincrónicos
  #5 (permalink)  
Antiguo 20/04/2018, 15:24
 
Fecha de Ingreso: octubre-2013
Mensajes: 79
Antigüedad: 10 años, 5 meses
Puntos: 1
Respuesta: Problema al devolver resultado de una funcion

Muchas gracias por tu tiempo :)

Estoy implementando de los consejos que me has dado este ultimo:

Cita:
function nuevoUsuario(nombre){
verificarDisponibilidad(nombre).then(function(resp uesta){
if (!respuesta){ //Cero equivale a "false"
registrarNombre(nombre);
}
else{
alert("El nombre ya se encuentra registrado");
}
});
}

function verificarDisponibilidad(nombre){
return new Promise(function(exito, error){
var xhr = new XMLHttpRequest();

xhr.open("GET", "verificar.php?nombre=" + nombre);
xhr.send();
xhr.addEventListener("load", function(){
if (this.status == 200){
exito(this.responseText); //La respuesta será el número de coincidencias del nombre en la base de datos
}
}, false);
});
}

nuevoUsuario("sentoki79");

Porque es el que mas se puede ajustar a como estoy desarrollando el codigo.
Pinta bastante bien pero aún me da errores.
La funcion nuevoUsuario(this)
la estoy poniendo en el evento onchange del input donde se escribe el nombre del usuario:
Código:
  <label>Nombre de usuario: </label> 
                                <input type="text"  id="nameUser" class="input" onchange="nuevoUsuario(this)">
Y ya en el archivo .js va el resto donde he implementado una ultima funcion dentro de la funcion nuevoUsuario()
Código:
function nuevoUsuario(nombre){
    
    verificarDisponibilidad(nom).then(function(respuesta){
        if (respuesta){ //Cero equivale a "false"
            registrarNombre();
        }
        else{
            alert("El nombre ya se encuentra registrado");
        }
    });
}

Pero la variable nombre que recoge la funcion verificarDisponibilidad() es objectInputHtmlElement, ya he deducido que es porque recoge el objeto y no el valor.
He probado con DOM en recoger el value de ese input y pasarlo a la funcion de verificarDisponibilidad() pero sigue recogiendo el objeto y no el valor del nombre del usuario.

Esta ya a puntito de caramelo como se suele decir :)


Gracias de nuevo por todo, saludos!
  #6 (permalink)  
Antiguo 20/04/2018, 16:54
Avatar de Alexis88
Philosopher
 
Fecha de Ingreso: noviembre-2011
Ubicación: Tacna, Perú
Mensajes: 5.551
Antigüedad: 12 años, 4 meses
Puntos: 977
Respuesta: Problema al devolver resultado de una funcion

En la llamada de la función debes pasar a this.value como argumento. Obviamente la línea de ejemplo nuevoUsuario("sentoki79"); ya no tiene cabida en esto (elimínala).

Solo te faltaría elaborar la función registrarNombre() a la cual debes pasarle el nombre ya filtrado, como mostré en el ejemplo. Esta función solo tendría que realizar el envío del nombre para ser guardado en la base de datos, para lo cual una petición asíncrona (AJAX) te sería útil. Asegúrate, también, de tener un archivo "verificar.php" como en el ejemplo. Dicho archivo es en el que realizarás la búsqueda en la base de datos para comprobar la existencia de coincidencias con el nombre dado. Si ya tienes otro archivo que realiza eso, solo cambia el nombre en esa parte del código.

__________________
«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
  #7 (permalink)  
Antiguo 20/04/2018, 18:11
 
Fecha de Ingreso: octubre-2013
Mensajes: 79
Antigüedad: 10 años, 5 meses
Puntos: 1
Respuesta: Problema al devolver resultado de una funcion

Hola,

ostras aunque tiene toda la logica emplear this.value sigue recogiendo el objeto no el valor.

Bueno me ha faltado explicar más como tengo desarrollado el codigo, realmente con el codigo que he mostrado en mi primer mensaje funcionaba pero no del todo. Me explico, mostraba con un alert cuando el nombre de usuario ya estaba registrado, y esa parte funcionaba bien. La que faltaba era para el caso que el usuario aun con esa advertencia pulsa en el boton de enviar el formulario y dar de alta los datos. Ahi es donde no consigo evitar que el formulario se envie. Tengo una funcion que comprueba todos los campo del formulario (nombre, apellidos, telefono, email, etc..) y si esta todo ok al llamar al boton de submit lo envia. En el boton de submit lleva a una funciona que llama a otra funcion de validar los datos del formulario. En una de esas dos funciones deberia poderse evitar enviar el formulario en el caso de que el nombre de usuario ya este registrado.

El codigo que me has pasado tiene muy buena pinta salvo por eso que recoje el objeto, entonces el servido siempre indica que el usuario no esta registrado porque no existen coincidencias logicamente.


Muchas gracias de nuevo, seguire dandole vueltas a ver como se puede solucionar.

Saludos!

Última edición por sentoki79; 20/04/2018 a las 18:34
  #8 (permalink)  
Antiguo 20/04/2018, 20:23
Avatar de Alexis88
Philosopher
 
Fecha de Ingreso: noviembre-2011
Ubicación: Tacna, Perú
Mensajes: 5.551
Antigüedad: 12 años, 4 meses
Puntos: 977
Respuesta: Problema al devolver resultado de una funcion

Es extraño que sigas teniendo ese problema, pues, en realidad, es una cuestión tan fácil de resolver como te lo expliqué. Sería útil ver el código actualizado para poder analizar mejor la situación actual. Si vas a colocar el código, por favor, usa el highlight de "JavaScript" para el código JavaScript y el de "HTML" para el código HTML. Eso permitirá que el código sea más legible. No olvides indentarlo (la sangría del código).

En cuanto a lo otro, puedes utilizar dos variables a manera de comodines o banderas que tengan un valor determinado, como true y false. Cuando las validaciones, tanto del nombre como del resto de datos, sean exitosas, entonces habilitas a ambas banderas (true), caso contrario, las deshabilitas (false). Mediante una condición, si ambas banderas son válidas, permites el envío de los datos del formulario, que bien puedes hacerlo con AJAX o con el método .submit().

Código Javascript:
Ver original
  1. var flagNombre = false, //Comodín o bandera del nombre
  2.     flagFormulario = true; //Comodín o bandera del formulario
  3.  
  4. function nuevoUsuario(nombre){
  5.     verificarDisponibilidad(nombre).then(function(respuesta){
  6.         if (!respuesta){ //Cero equivale a "false"
  7.             flagNombre = true; //Si el nombre no se encuentra registrado, se habilita al comodín del nombre
  8.         }
  9.         else{
  10.             alert("El nombre ya se encuentra registrado");
  11.         }
  12.     });
  13. }
  14.  
  15. function verificarDisponibilidad(nombre){
  16.     return new Promise(function(exito, error){
  17.         var xhr = new XMLHttpRequest();
  18.  
  19.         xhr.open("GET", "verificar.php?nombre=" + nombre);
  20.         xhr.send();
  21.         xhr.addEventListener("load", function(){
  22.             if (this.status == 200){
  23.                 exito(this.responseText); //La respuesta será el número de coincidencias del nombre en la base de datos
  24.             }
  25.         }, false);
  26.     });
  27. }
  28.  
  29. function validar(form){
  30.     for (var i = 0, f = form.elements, l = f.length; i < l; i++){
  31.         if (/* si el valor de f[i] no es válido */){
  32.             flagFormulario = false; //Se deshabilita el comodín del formulario
  33.             break; //Y se termina el bucle
  34.         }
  35.     });
  36.  
  37.     if (flagNombre && flagFormulario){
  38.         //Si ambos comodines son verdaderos, se envía el formulario
  39.     }
  40. }

__________________
«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
  #9 (permalink)  
Antiguo 21/04/2018, 05:01
 
Fecha de Ingreso: octubre-2013
Mensajes: 79
Antigüedad: 10 años, 5 meses
Puntos: 1
Respuesta: Problema al devolver resultado de una funcion

Hola,

de nuevo muchas gracias por aportar soluciones.
Si voy adjuntar el codigo mejor :)



Código HTML:
 <form id="registro"><br>
                        <h3>Todos los campos son obligatorios</h3>
                       
                         <label>Nombre de usuario: </label> 
                        <input type="text"  id="nameUser" class="input" onchange="nuevoUsuario(this.value)">
                        <label>DNI: </label> <input required type="text" id="DNI" /><p class="advertencia2"> *EL DNI ha de tener el formato, ejemplo: 12345678A</p><br>  
                        <p class="advertencia1">*las contraseñas han de tener entre 6 y 16 caracteres contener al menos una letra mayuscula, un numero y una letra minuscula</p> 
                        <label>Contraseña:</label> 
                        <input required type="password" id="password1"/>
                        <label>Repita la contraseña:</label> 
                        <input required type="password" id="password2" />
                        <label>Su nombre:</label> 
                        <input required type="text" id="nombre" />
                        <label>Primer apellido:</label> 
                        <input required type="text" id="apellido1" />
                        <label>Segundo apellido:</label> 
                        <input required type="text" id="apellido2" />
                        <label>Email:</label> 
                        <input required type="text" id="email" />
                        <label>Telefono:</label> 
                        <input required type="text" id="TLF" />
                     
                        <a id="envio"  onclick="  registrarse()">Registrarse</a>
  </form> 



Código:
 function registrarNombre(){
     
     return true; 
     
 }



function nuevoUsuario(nombre){
     alert(nombre)
    verificarDisponibilidad(nombre).then(function(respuesta){
       
        if (respuesta){ //Cero equivale a "false"
            registrarNombre();
        }
        else{
            alert("El nombre ya se encuentra registrado");
        }
    });
}
 
function verificarDisponibilidad(nombre){
    return new Promise(function(exito, error){
        var xhr=nuevoAjax()
 
      xhr.open("POST", "http://localhost:8080/Front/CompruebaNombreUsuario", true);
        xhr.send(nombre);
        xhr.addEventListener("load", function(){
            if (this.status == 200){
                exito(this.responseText); //La respuesta será el número de coincidencias del nombre en la base de datos
            }
        }, false);
    });
}



function registrarse() {

//se crea una clase persona y una clase usuario que hereda propiedades de esta
    function persona(nombre, apellido1, apellido2, DNI) {
        this.nombre = nombre;
        this.apellido1 = apellido1;
        this.apellido2 = apellido2;
        this.DNI = DNI;
    }


    usuario.prototype = new persona;

    function usuario(nombreUsuario, password, email, telefono, nombre, apellido1, apellido2, DNI) {
        persona.call(this, nombre, apellido1, apellido2, DNI)
        this.nombreUsuario = nombreUsuario;
        this.password = password;
        this.email = email;
        this.telefono = telefono;
     

    }
//se crea un metodo para enviar los datos de cada objeto usuario al servidor
    usuario.prototype.enviaInfo = function () {

        return "login=" + this.nombreUsuario + "&password=" + this.password + "&nombre=" + this.nombre + "&apellido1=" + this.apellido1 + "&apellido2=" + this.apellido2 + "&DNI=" + this.DNI + "&email=" + this.email + "&telefono=" + this.telefono;
    }



    /*creo un metodo a partir de la clase string. Por la posibilidad de los dispositivos moviles 
     tengan configurado de que la primera letra de cada frase empiece por mayusculas. Posteriormente le pasare el metodo toLowerCase por si hubieran mas letras en minusculas. 
     Podria haber pasado el metodo toLowrString directamente, pero me hacia ilusion crear ese metodo. :)*/

    String.prototype.ToLowerFirstCase = function () {
        primeraLetra = this.substring(0, 1)

        return this.replace(nombreUsuario.substring(0, 1), primeraLetra.toLowerCase());
    }

    /*Aqui se recogen el valor de las variables y se llamara a la funcion para validar uno a uno los datos
     a ver si son correctos*/

    /*utilizo el metodo trim() por si el usuario introduciera un espacio en blanco sin querer para que no hayan 
     problemas al interactuar con la base de datos al hacer consultas sobre ese dato guardado*/
    var nombreUsuario= document.getElementById("nameUser").value.trim();

    var password1 = document.getElementById("password1").value.trim();
    var password2 = document.getElementById("password2").value.trim();
    var nombre = document.getElementById("nombre").value.trim();
    var apellido1 = document.getElementById("apellido1").value.trim();
    var apellido2 = document.getElementById("apellido2").value.trim();
    var DNI = document.getElementById("DNI").value.trim();
    var email = document.getElementById("email").value.trim();
    email = email.toLowerCase();
    var telefono = document.getElementById("TLF").value.trim();


    var formulario = validarFormulario(usuario, password1, password2, nombre, apellido1, apellido2, DNI, email, telefono)
 var compruebaNombreUsuario=registrarNombre();

    //llamo al constructor usuario y creo un nuevo objeto usuario
    //implemento el metodo creado con prototype sobre la variable email
    var usuario= new usuario(nombreUsuario, password1, email.ToLowerFirstCase(), telefono, nombre, apellido1, apellido2, DNI)

    //se comprueba de si no han habido errores en el formulario se prepara el envio de datos al servidor
    if (formulario == true&&compruebaNombreUsuario==true) {


        //con esta linea al enviar el formlario el boton de enviar se vuelve no accesible


        //datos que se recogen del metodo de la clase usuario para el envio por POST:
        var datos = usuario.enviaInfo();
   

    var xhr = nuevoAjax();
    var url = "Registro";
    xhr.open("POST",url, true );
    xhr.setRequestHeader("Content-type","application/x-www-form-urlencoded");

    xhr.send(datos);
    
   
    alert("Se ha dado de alta")

    
    }
}

Bueno he puesto tambien la funcion registrarse que aunque hay un poco de morralla para lo que seria resolver el problema, he creido que meor dejo todo el codigo para que no "despiste" el ver qu faltan cosas.
El alert en la funcion nuevoUsuario() ahi es donde muestra el objeto del input en vez del valor del input.
Como veras he creado una tercera funcion la de compruebaNombreUsuario() que si es llamada retorna true, porque no estaba seguro que llamando a la otra funcion no volviera a pasar que devolviera undefined. Bueno se puede modificar o dejar asi solo era por darle una explicacion.

Gracias :) saludos
  #10 (permalink)  
Antiguo 21/04/2018, 09:51
Avatar de Alexis88
Philosopher
 
Fecha de Ingreso: noviembre-2011
Ubicación: Tacna, Perú
Mensajes: 5.551
Antigüedad: 12 años, 4 meses
Puntos: 977
Respuesta: Problema al devolver resultado de una funcion

Como lo dije, no debe devolverse el objeto HTML sino el valor escrito. Para muestra, un ejemplo.

En cuanto al tema del envío de los datos con el uso de banderas, ¿cómo te fue? Supongo que bien. No parece haber errores.

__________________
«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
  #11 (permalink)  
Antiguo 21/04/2018, 16:57
 
Fecha de Ingreso: octubre-2013
Mensajes: 79
Antigüedad: 10 años, 5 meses
Puntos: 1
Respuesta: Problema al devolver resultado de una funcion

Hola,
Lo de los flags tampoco va muy bien aunque devuelve un true el servidor no entra en la condicion del if true, pero creo que lo primero es mirar porque siempre envia el objeto del input.

Tengo que investigar mas sobre a gente que le haya pasado lo mismo con lo de this.value y a ver que solucion le ha dasdo y probar.

Gracias has sido amable y muy resolutivo dando soluciones. De un 10!

Saludos!
  #12 (permalink)  
Antiguo 21/04/2018, 22:40
Avatar de Alexis88
Philosopher
 
Fecha de Ingreso: noviembre-2011
Ubicación: Tacna, Perú
Mensajes: 5.551
Antigüedad: 12 años, 4 meses
Puntos: 977
Respuesta: Problema al devolver resultado de una funcion

A estas alturas, lo único que se me ocurre es que estés teniendo un problema de memoria caché, por lo que un Ctrl+F5 podría ser la solución. No se pierde nada intentando.

__________________
«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
  #13 (permalink)  
Antiguo 22/04/2018, 07:28
 
Fecha de Ingreso: octubre-2013
Mensajes: 79
Antigüedad: 10 años, 5 meses
Puntos: 1
Respuesta: Problema al devolver resultado de una funcion

Hola,

si te refieres a la cache del navegador, generalmente suelo borrar la cache de historial, archivos, imagenes, etc..

Puedo decir que ya funciona!

Misteriosamente, y sin haber refrescado la cache del navegador, ha empezado a recoger bien el valor con this.value.

He implementado un poco mejor el codigo que me pasastes añadiendo esta linea al previo envio de AJAX:

Código:
xhr.setRequestHeader("Content-type","application/x-www-form-urlencoded");

Porque estaban llegando sin esa linea de codigo los datos al servidor como null.

Y a partir de ahí las funciones que me has pasado han funcionado a la perfección.


Mil gracias! era un reto que me quedo pendiente en otra aplicación del curso y que no pude conseguir por falta de tiempo.

Gracias mil por tu ayuda saludos
  #14 (permalink)  
Antiguo 22/04/2018, 08:53
 
Fecha de Ingreso: octubre-2013
Mensajes: 79
Antigüedad: 10 años, 5 meses
Puntos: 1
Respuesta: Problema al devolver resultado de una funcion

Buenas de nuevo,


perdón rectifico no está conseguido

No lo habia comprobado del todo bien y mejorando el codigo veo que no envia el formulario aunque el usuario este libre por que la funcion nuevoUsuario(nombreUsuario) devuelve otra vez undefined.

Pego el codigo como lo tengo actualmente:
Código:
function nuevoUsuario(nombre){
 var flagNombre = false
    verificarDisponibilidad(nombre).then(function(respuesta){
       
        if (respuesta==1){ //Cero equivale a "false"
        var muestraOk=document.getElementById("muestraOk")
        muestraOk.innerHTML="El nombre de usuario esta libre"
            flagNombre = true
            return flagNombre
        }
        else{
             var muestraOk=document.getElementById("muestraOk")
        muestraOk.innerHTML=""
            alert("El nombre ya se encuentra registrado. Por favor vuelva a introducir un nuevo nombre de usuario para comprobar si esta libre. ");
        return flagNombre
        }
    });
}
 


function verificarDisponibilidad(nombre){
    return new Promise(function(exito, error){
        var xhr=nuevoAjax()
        var datos=  "usuario="+nombre
        xhr.open("POST", "http://localhost:8080/Front/CompruebaNombreUsuario", true);
        xhr.setRequestHeader("Content-type","application/x-www-form-urlencoded");
        xhr.send(datos);
        xhr.addEventListener("load", function(){
            if (this.status == 200){
                exito(this.responseText); //La respuesta será el número de coincidencias del nombre en la base de datos
            }
        }, false);
    });
}



function registrarse() {

 var formulario = validarFormulario()
 var compruebaNombreUsuario=nuevoUsuario(nombreUsuario);
 alert(compruebaNombreUsuario)


    //se comprueba de si no han habido errores en el formulario se prepara el envio de datos al servidor
    if (formulario == true&&compruebaNombreUsuario==true) {



        //datos que se recogen del metodo de la clase usuario para el envio por POST:
       var datos = usuario.enviaInfo();
   

       var xhr = nuevoAjax();
       var url = "Registro";
       xhr.open("POST",url, true );
       xhr.setRequestHeader("Content-type","application/x-www-form-urlencoded");
       xhr.send(datos);
    
   }
Bueno la funcion registrarse() esta vez la he simplificado a lo importante para el problema.
El alert(compruebaNombreUsuario) es el que devuelve undefined y por eso no cumple el if y no envia el formulario.


De nuevo gracias por las soluciones, me parece que se vuelve al punto donde empezó el mensaje en este tema al estilo un bucle while jeje


Gracias y saludos

Última edición por sentoki79; 22/04/2018 a las 09:09
  #15 (permalink)  
Antiguo 22/04/2018, 10:19
Avatar de Alexis88
Philosopher
 
Fecha de Ingreso: noviembre-2011
Ubicación: Tacna, Perú
Mensajes: 5.551
Antigüedad: 12 años, 4 meses
Puntos: 977
Respuesta: Problema al devolver resultado de una funcion

Creí que quedó claro que no es conveniente retornar valores en procesos asincrónicos.

Como la función "nuevoUsuario" se ejecutará solo cuando se escriba el nombre en la caja de texto y no cuando se envíen los datos para su procesamiento, no hace falta que devuelva nada; tan solo debe establecer el valor del comodín del nombre. Por otro lado, cuando se ejecute el envío de los datos, primero se llevará a cabo la validación de los demás datos, y es allí cuando se determinará si el comodín del formulario se inhabilitará o si seguirá estando habilitado. Una vez que este último proceso termine, se comprobará que ambos comodines estén habilitados (true) y se decidirá si se envían los datos al lado del servidor para ser almacenados en la base de datos o no.

Eso es todo. No te compliques en vano.

__________________
«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
  #16 (permalink)  
Antiguo 22/04/2018, 13:22
 
Fecha de Ingreso: octubre-2013
Mensajes: 79
Antigüedad: 10 años, 5 meses
Puntos: 1
Respuesta: Problema al devolver resultado de una funcion

Hola de nuevo,

ahora sí, tenias razón lo estaba complicando sin necesidad.
Disculpa me ha cogido en fin de semana la aclaración de los flags y no lo comprendí bien.
Ahora va perfectamente y ha quedado muy bien implementado el codigo con lo que buscaba que realizase la aplicación.

De nuevo muchas gracias! saludos

Etiquetas: ajax, devolver, funcion, resultado
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 05:43.