La inexperiencia?

kraneok

Pues nada, una vez mas aquí y con otro tema.
Estoy realizando un chat y estoy atascado en un problema que me está haciendo pensar que soy bastante tonto.
He detectado que es lo que pasa, pero no sé por qué y mucho menos como solucionarlo.

this.registerClient = function(clientNick){
	var accept;
		$.post('./js/dbControl.php',{client: clientNick, action: 'register'}, function(data){
			if(data == 'register'){
				accept = true;
			}else{
				accept = false;
			}	
		});
		return accept;
	}

Con este código básicamente lo que hago es registrar en en la db a un nick, lo que realiza el .php es lo común: comprobar que no existe y si no existe registrarlo y devolverme un accept o un denied.

Bien, en este caso y como estoy montando el código, el .php me devuelve un 'register' como me lo devuelve si o si, por que lo tengo yo puesto a mano para que me lo devuelva, accept pasaría a ser true, bien, pues no será por mi inexperiencia pero registerClien no me devuelve el accept con el true.
Razón detectada: probando con console.log() añadido a varias lineas con números, es decir:

this.registerClient = function(clientNick){
console.log("1");
	var accept;
		$.post('./js/dbControl.php',{client: clientNick, action: 'register'}, function(data){
                console.log("2");
			if(data == 'register'){
				accept = true;
                                console.log("3");
			}else{
				accept = false;
			}	
		});
                console.log("4");
		return accept;
	}

se puede observar como antes de pasarme por el $.post, me pasar directamente por el return, es decir, si que miro el console en un debugger se ve esto:

1
4
2
3

¿ Qué se me está pasando por arriba?, ¿ Por qué se está ejecutando el return antes de el envío post ?, me lo puedo imaginar por que es, pero no se la solución que tiene.

Gracias y saludos.

elkaoD

El return lo has puesto FUERA del callback.

Aún así, en general no puedes retornar nada de un callback. Un callback es asíncrono. Lo estás pensando mal.

1 respuesta
kraneok

#2 Como podría pues solucionar esto?

1 respuesta
elkaoD

#3 haz el request síncrono ("async: false" en el mapa de la llamada) o modifica tu código para que funcione con un callback asíncrono (normalmente es lo ideal, basarse en eventos y no en flujos de ejecución.)

En resumen, no hagas return sino que debes realizar las acciones adecuadas en el callback y fin.

kraneok

#5 Bien, gracias por guiarme xD

Usuarios habituales

  • kraneok
  • elkaoD