entre Desarrolladores

Recibe ayuda de expertos

Registrate y pregunta

Es gratis y fácil

Recibe respuestas

Respuestas, votos y comentarios

Vota y selecciona respuestas

Recibe puntos, vota y da la solución

Pregunta

1voto

Abortar una llamada Ajax

Estoy intentando abortar una llamada Ajax, pero no consigo hacerlo. El caso es el siguiente, comprueba el usuario de facebook si está en la aplicación y me redirige hacia dentro de la aplicación, pero me sigue recargando la página cada segundo. Entonces quiero abortar la llamada, he intentado de mil formas pero no consigo hacerlo. Este es el código:

function controlarStatus(respuesta)
                            {
                                if (respuesta.authResponse)
                                {   
                                    //writeOutput('Control status (con respuesta): '+respuesta.status);
                                    if (respuesta.status === STATUS_CONNECTED) 
                                    {
                                        /* 
                                            El usuario está logueado y además ha sido autenticado por
                                            la aplicación. En este caso, respuesta.authResponse contiene el ID 
                                            del usuario, un token de acceso válido, una petición firmada y el momento
                                            en que el token de acceso y la petición firmada caducarán
                                        */

                                        // Podriamos guardar datos como el userID y el token de acceso
                                        uid = respuesta.authResponse.userID;
                                        accessToken = respuesta.authResponse.accessToken;

                                        $('#logout').show();
                                        $('#authorize').hide();
                                        $('#login_facebook').hide();

                                        var contador = 0;

                                        FB.api('/me', function(response) {
                                          contador = 1;
                                          var dataFacebook = "username="+response.name+"&token="+accessToken+"&email="+response.email+"&nombre="+response.first_name+"&sexo="+response.gender+"&nacimiento="+response.user_birthday;
                                          $.ajax({
                                            type: "POST",
                                            url: "php/registro-facebook.php", //Mando a ajaxdatos.php
                                            data: dataFacebook, //La cedula
                                            success: function(data) {
                                                if(data == 'registroOK'){ //Si ajaxdatos.php me devuelve algo
                                                    $('#abrirAcceder').modal('hide'); //oculto el modal de cedula
                                                    $('#error_acceso').hide(); //oculto el modal de cedula
                                                    urlWeb = "XXXXXXXXXXXXXX";
                                                    $(location).attr('href',urlWeb);
                                                }else{ //si no me devuelve nada el ajaxdatos.php (porque no valido los datos)
                                                    $('#abrirAcceder').modal('hide'); //oculto el modal de cedula
                                                    $('#error_acceso').hide(); //oculto el modal de cedula
                                                    urlWeb = "XXXXXXXXXXXXXX";
                                                    $(location).attr('href',urlWeb);
                                                }
                                            }
                                          });
                                        });
                                    } 
                                    else if (respuesta.status === STATUS_NOT_AUTHORIZED) 
                                    {
                                        /*
                                            El usuario está logueado en Facebook, pero no ha sido autenticado
                                            por la aplicación. Se debería permitir mediante un botón o enlace (si se
                                            hace de forma automática, el cuadro de diálogo puede ser interpretado como 
                                            un popup a bloquear).
                                        */
                                        $('#authorize').show();
                                        $('#logout').show();
                                        $('#login_facebook').hide();
                                    } 
                                    else 
                                    {
                                        // El usuario no está logueado en Facebook
                                        $('#login_facebook').show();
                                        $('#authorize').hide();
                                        $('#logout').hide();
                                    }
                                }
                                else
                                {
                                    //writeOutput('Control Status (sin respuesta): '+respuesta.status);

                                    if (isLogginProcess)
                                    {
                                        // Si el usuario viene de un proceso de login, es posible que 
                                        // haya dado a cancelar en la ventana, por lo que internamente
                                        // solicitamos un nuevo control de estado del usuario
                                        // El parámetro true es fundamental para que la petición no se
                                        // cachee, y por tanto obtengamos el estado real
                                        isLogginProcess = false;
                                        FB.getLoginStatus(controlarStatus, true);
                                    }

                                    if (respuesta.status === STATUS_NOT_AUTHORIZED) 
                                    {                   
                                        $('#authorize').show();
                                        $('#login_facebook').hide();
                                        $('#logout').hide();
                                    }
                                    else 
                                    {
                                        $('#login_facebook').show();
                                        $('#authorize').hide();                 
                                        $('#logout').hide();
                                    }
                                }
                            }

2 Respuestas

0voto

Leonardo-Tadei Puntos227320

La forma que te indica Carlos de abortar la llamada AJAX es correcta... pero en este caso, sería mejor llevar una variable global con el estado del login, y en caso de estar logueado, dejar de hacer la llamada AJAX e ignorar la respuesta de las ya iniciadas!

Veo el código de la otra pregunta a la tarde y te digo que veo ahí...

0voto

danielreales7 comentado

Yo controlo el estado de la sesión con el id del usuario, pero no sé exactamente como tú dices, ya me comentas cuando tengas tiempo y gracias!

0voto

Leonardo-Tadei comentado

Pero esto no funciona!

La página A carga y ofrece login al usuario.
El usuario se loguea y la página A envía vía AJAX al sacript B los datos.
El script B autentifica y crea la sesión.
La página A no se entera, porque el vector $_SESSION tomará valores al cargarse la página, y A no se vuelve a cargar gracias a nuestro amigo AJAX.

Lo que te proponía es crear una variable JavaScript accesible desde todos lados, por ejemplo:

var esta_logueado = false;

y que luego de que FB responde afirmativamente, cabiarla a true

De esta manera, podés controlar el código JavaScript que se ejecuta, incluyendo la llamada AJAX consultando el estado de esta variable.

En otras palabras, usá una bandera local para saber si se está logueado o no. En cualquier caso, siempre podés asignar el valor de la bandera al cargar la página mediante PHP:

var esta_logueado = <?php print($valor);?>;

en dónde para que JS no falle, la variable $valor tendrá que tener el string true o false.

Se entiende la idea?

0voto

danielreales7 comentado

Entonces creo esa variable global, y cuando facebook la valide, es decir, debajo de la llamada Ajax la pongo a true, y entonces que creo una condición de si esa variable es verdadera o falsa, llamo a dicha función o no no?
Porque es más o menos lo que intenté pero con un contador.

0voto

Leonardo-Tadei comentado

Hola Daniel,

es más o menos como decís. Te hago algunas puntualizaciones por esto de la ambigüedad del lenguaje hablado:

La variable global a cambiar y FB autentifica no es abajo de la llamada AJAX, sino en el evento de la respuesta que dice que FB autentificó correctamente. La línea posterior a la llamada AJAX siempre se va a ejecutar por el caracter asincrónico de la comunicación.

Si no veo mal, sería adentro de:

...
if (respuesta.status === STATUS_CONNECTED) 
{
...

Luego, si la variable es false (no autentificado) disparás la llamada de login a FB o no.

0voto

danielreales7 comentado

Vale ya lo entendí, muchísimas gracias Leonardo.

0voto

carlossevi Puntos63580

Para abortar una llamada Ajax tienes primer que conservar el objeto que contiene la llamada.

En lugar de:

$.ajax({
    type: 'POST',
    url: 'miurl',
    success: function(result){}
});

debes usarla así:

var mipeticion = $.ajax({
    type: 'POST',
    url: 'miurl',
    success: function(result){}
});

Una vez que en mipeticion tienes almacenado el objeto de la llamada puedes hacer lo siguiente si quieres abortarla:

mipeticion.abort();

0voto

danielreales7 comentado

Eso es lo que estaba haciendo, pero cuando entra en la aplicación me sigue recargando la página a cada segundo, eso quiere decir que no ha abortado la llamada, lo he intentado de mil formas pero nada.

0voto

carlossevi comentado

Si te refieres a la conversación que ya tienes iniciada aquí http://entredesarrolladores.com/4604/inicio-de-sesi%C3%B3n-con-facebook creo que son cosas diferentes.

Respecto a tu pregunta: las llamadas Ajax se abortan de esta manera, otra cosa es que tu problema no se solucione abortando la llamada.

Lo que yo entiendo que te está pasando:

  1. Haces llamada Ajax que descencadena el script PHP
  2. El script PHP redirige con header("Location: .....")
  3. Cuando se carga la nueva página se comprueba la sesión y vuelve al punto 1

De esta forma se entra en un bucle infinito. No creo que la solución sea cancelar la llamada Ajax sino que pasa por cambiar el flujo del proceso.

0voto

danielreales7 comentado

El script PHP no redirige con header("....") sino que me devuelve una cadena y en función de esa cadena ya después redirigo a la página que yo quiera.

Por eso yo pensaba que poniendo justo debajo del ajax, por ejemplo, la declaro con mipeticion, como me comentastes antes y llamo a esta función y justo debajo mipeticion.abort(); pero lo que te dije.

Por favor, accede o regístrate para responder a esta pregunta.

Otras Preguntas y Respuestas


...

Bienvenido a entre Desarrolladores, donde puedes realizar preguntas y recibir respuestas de otros miembros de la comunidad.

Conecta