Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/reactjs/21.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 为什么赢了';我的容器组件是否正确接收异步等待的结果?_Javascript_Reactjs_Firebase_Firebase Authentication - Fatal编程技术网

Javascript 为什么赢了';我的容器组件是否正确接收异步等待的结果?

Javascript 为什么赢了';我的容器组件是否正确接收异步等待的结果?,javascript,reactjs,firebase,firebase-authentication,Javascript,Reactjs,Firebase,Firebase Authentication,这让我有点发疯 预期行为: 我点击一个按钮>它触发checkLoginStatus>,它从firebase返回true或false>布尔值存储在isLoggedIn>即控制台中。注销 实际结果: 我单击按钮>它触发函数关闭>控制台日志显示为未定义/错误>然后返回用户对象 问题: 为什么我的React容器方法isuseralreadyaauthenticated()在wait完成之前注销 上下文: 我有一套4个实用函数。他们每个人都关注firebase/登录生命周期中的不同元素(注册、登录、注销、

这让我有点发疯

预期行为:

我点击一个按钮>它触发checkLoginStatus>,它从firebase返回true或false>布尔值存储在isLoggedIn>即控制台中。注销

实际结果: 我单击按钮>它触发函数关闭>控制台日志显示为未定义/错误>然后返回用户对象

问题: 为什么我的React容器方法
isuseralreadyaauthenticated()
wait
完成之前注销

上下文:

我有一套4个实用函数。他们每个人都关注firebase/登录生命周期中的不同元素(注册、登录、注销、hasUserAuthenticatedBefore…)

它们都是异步等待函数。例如,这是一个很好的登录:-

export const login = async (email, password) => {
    let defaultStatus = false;
    try {
        await firebase.auth().signInWithEmailAndPassword(email, password)
            .then(res => {
                // if firebase fires back a user object, then login is true.
                if (res.user.email) {
                    defaultStatus = true;
                }
            })
            .catch(error => {
                console.log('Firebase | sign in error: ', error.message);
                defaultStatus = false;
            });
    } catch (err) {
        console.log('Login | error: ', err);
    }
    console.log('login status after logging in Try/Catch is: ', defaultStatus);
    return defaultStatus;
}
注意:当我在容器中调用此函数时,它会得到正确的返回布尔响应

现在。。。如果我看一下checkLoginStatus函数。没有任何变化或怪异而奇妙的重写能让它以类似的方式表现

export const checkLoginStatus = async () => {
    let defaultStatus = false;
    try {
        firebase.auth().onAuthStateChanged(user => {
            // if user exists then defaultStatus = true;
            // if not exists then defaultStatus = false;
        })
    } catch (err) {
        console.log('sign up user error: ', err);
    }
    console.log('default status after checking login status: ', defaultStatus);
    return defaultStatus;
}
然后在我的容器中:-

isUserAlreadyAuthenticated = async () => {
    let isLoggedIn = await this.props.checkLoginStatus();
    console.log('is foo here? ===>', isLoggedIn); // undefined
}
我尝试过的事情:-

将util函数更改为promise(这获取checkLoginStatus不是函数错误)

从isUserAlreadyAuthenticated删除异步;像普通函数一样启动它(因为异步部分是在util函数本身中管理的)。没有快乐

将onAuthStateChanged()api更改为
。然后()。没有变化

我从
checkLoginStatus
中删除了所有Firebase代码,只是让它在
setTimeout()之后返回一个字符串,并且在检索用户对象之前,它仍然返回未定义的字符串


我在这里看不到什么?

多亏了@FelixKling和@Think Twow

事实上,我最终将util函数包装成了一个承诺,并阅读了async await。我以为我明白,但有些怪癖我不明白

不过,关键似乎是加入了一个递归元素

util函数:

export function checkLoginStatus() {
    return new Promise((resolve, reject) => {
        const unsubscribe = firebase.auth().onAuthStateChanged(user => {
            unsubscribe(); // <--- calls itself and resolves with a successful user object or null
            resolve(user);
        }, reject('api has failed'));
    });
}
导出函数checkLoginStatus(){
返回新承诺((解决、拒绝)=>{
const unsubscribe=firebase.auth().onAuthStateChanged(用户=>{
取消订阅();//{
试一试{
让user=wait this.props.checkLoginStatus();
log('react-side:',user);
if(用户和用户电子邮件){
这是我的国家({
isLoggedIn:true,//“我在这里看不到什么?”在第一种情况下,它的工作原理是使用
await
。在第二种情况下,您没有使用
await
。但是,您混合使用
async/await
的方式。然后
回调非常不寻常。您应该使用
尝试{return Boolean((await firebase.auth()).signInWithEmailAndPassword()).user.email);}catch(e){return false;}
我建议您更好地了解它的实际工作原理。
   isUserAlreadyAuthenticated = async () => {

        try {
            let user = await this.props.checkLoginStatus();
            console.log('react side: ', user);
            if (user && user.email) {
                this.setState({
                    isLoggedIn: true, // <-- when true page navs to Homepage
                });
            }
        } catch(err) {
            console.log('catch | api error: ', err);   
        }
    }