Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/402.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 获取fetch之外的变量_Javascript_Reactjs - Fatal编程技术网

Javascript 获取fetch之外的变量

Javascript 获取fetch之外的变量,javascript,reactjs,Javascript,Reactjs,我有一个登录功能,我想显示一个警报,这取决于登录是成功还是错误。首先,我声明变量,然后根据结果获取变量的值 抓取完成后,根据这个值,我想显示警报。 我的问题是,在获取之后,该值是未定义的 这是我的密码 onLogin(){ var a; fetch('http://xxxxx/user/login', { method: 'POST', headers: {'Content-Type': 'application/json'},

我有一个登录功能,我想显示一个警报,这取决于登录是成功还是错误。首先,我声明变量,然后根据结果获取变量的值

抓取完成后,根据这个值,我想显示警报。 我的问题是,在获取之后,该值是未定义的

这是我的密码

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

        }

        }

在将值分配给时,基本上是重新定义它,而不是分配值。
删除then()中的var关键字,它应该可以工作

您正在重新声明变量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

    }

    }
你有两个问题

  • 您正在声明变量
    a
    (删除
    中的关键字
    var
    。然后()
    函数将在函数级别声明它)
  • fetch
    是异步的,因此不能保证在调用其值时定义
    a
  • 一个稍微好一点的实现方法是将回调函数传递到您的
    onLogin
    函数中(并且从一开始就不需要
    var A

    例如:

    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
        }
    });
    

    fetch是异步的。在收到fetch调用的响应之前,您正在显示警报。取决于fetch结果的代码应该是的一部分。然后在fetch结束时显示