Tengo una función de inicio de sesión donde quiero mostrar una alerta dependiendo de si el inicio de sesión es exitoso o incorrecto. En primer lugar, declaro la variable y después de hacer la búsqueda donde, dependiendo del resultado, le doy un valor a la variable.

Y después de que se realiza la búsqueda, dependiendo de este valor, quiero mostrar la alerta. Mi problema es que el valor no está definido después de la búsqueda.

Este es mi código.

onLogin(){
        var a;
        fetch('http://xxxxx/user/login', {
        method: 'POST',
        headers: {'Content-Type': 'application/json'},
        body: JSON.stringify({
                username: this.username,
                password: this.password
                })
        })
        .then(function(response){
        if (response.status === 404){
        response.text().then(function(object){
            var a = "NO";
        })
        } else if (response.status === 200){
        response.text().then(function(object){
            var a = "OK";
        })}
        })

      if (a == "OK"){ 
        Alert.alert(
            'Acceso',
            'a',
            [{
                text: 'Aceptar',
                onPress: (this.aceptar.bind(this))
            },
            {
                text: 'Cancelar',
                onPress: (this.cancelar.bind(this))
            }]

        )}
        else if (a == "NO"{
            //something

        }

        }
0
dddddrrrrrr 30 oct. 2017 a las 20:50

3 respuestas

La mejor respuesta

Tienes dos problemas

  1. Re-declara la variable a (eliminar la palabra clave var en la función .then() la mantendrá declarada en un nivel de función).
  2. fetch es asíncrono, por lo que no se garantiza que a se defina en el momento en que llama a su valor.

Una forma un poco mejor de lograr lo que está buscando es pasar una función de devolución de llamada a su función onLogin (y evitar la necesidad de var a para empezar).

Ejemplo:

onLogin(callback) {
    fetch('http://xxxxx/user/login', {
        method: 'POST',
        headers: {'Content-Type': 'application/json'},
        body: JSON.stringify({
            username: this.username,
            password: this.password
        })
    })
    .then(function(response) {
        var successful = true;
        if (response.status === 200) {
            callback(successful);
        } else {
            callback(!successful);
        }
    });
};

onLogin(function (successful) {  // call the onLogin and pass in a function as a callback
   if (successful){ 
        Alert.alert(
            'Acceso',
            'a',
            [{
                text: 'Aceptar',
                onPress: (this.aceptar.bind(this))
            },
            {
                text: 'Cancelar',
                onPress: (this.cancelar.bind(this))
            }]
        );
    } else {
        // not successful, do something else
    }
});
2
pete 30 oct. 2017 a las 18:05

Estás declarando la variable a

onLogin(){
    var a; **Here you have declared the variable**
    fetch('http://xxxxx/user/login', {
    method: 'POST',
    headers: {'Content-Type': 'application/json'},
    body: JSON.stringify({
            username: this.username,
            password: this.password
            })
    })
    .then(function(response){
    if (response.status === 404){
    response.text().then(function(object){
        //Here you are redeclaring it. just remove var
        a = "NO";
    })
    } else if (response.status === 200){
    response.text().then(function(object){
        //Here too
        a = "OK";
    })}
    })

  if (a == "OK"){ 
    Alert.alert(
        'Acceso',
        'a',
        [{
            text: 'Aceptar',
            onPress: (this.aceptar.bind(this))
        },
        {
            text: 'Cancelar',
            onPress: (this.cancelar.bind(this))
        }]

    )}
    else if (a == "NO"{
        //something

    }

    }
0
Nirmal Kumar 30 oct. 2017 a las 17:54

En el punto de asignar valores a a, básicamente lo redeclarás en lugar de asignarle un valor. Elimine la palabra clave var en su then () y debería funcionar.

0
Simmetric 30 oct. 2017 a las 17:53