React Native Asyn c Обещание, ожидающее навсегда - PullRequest
0 голосов
/ 10 марта 2020

Я использую Firebase Firestore, я использую три ожидания. Логика c заключается в том, что выходные данные не должны возвращаться, если в коллекции Firestore ничего нет, поэтому выходные данные должны быть установлены только одной функцией. Мне интересно, вызывают ли эти три ожидания его вечное ожидание или есть что-то, чего я не понимаю в асинхронном / ожидании. Я новичок в этом, поэтому любые ресурсы или ответы помогут. Спасибо!

componentDidMount() {

        // sends to different home screen based on authentication
        async function authSwitch(cred) {

            var output;

            await firebase.firestore().collection('Students').where("uid", "==", cred).get().then(function (querySnapshot) {
                querySnapshot.forEach(function (doc) {
                    output = "student";
                });
            });

            await firebase.firestore().collection('Admin').where("uid", "==", cred).get().then(function (querySnapshot) {
                querySnapshot.forEach(function (doc) {
                    console.log(doc.id);
                    output = "admin";
                });
            });

            await firebase.firestore().collection('Preceptors').where("uid", "==", cred).get().then(function (querySnapshot) {
                querySnapshot.forEach(function (doc) {
                    output = "preceptor";
                });
            });

            return output;
        }

        firebase.auth().onAuthStateChanged(user => {
            if(user) {
                console.log(user.uid);
                console.log(authSwitch(user.uid));
                this.props.navigation.navigate(authSwitch(user.uid));

            }
            else {
                this.props.navigation.navigate("Auth");
            }
        });
    }

    render() {
        return (
            <View style={styles.container}>
                <Text>Loading...</Text>
                <ActivityIndicator size = "large"></ActivityIndicator>
            </View>
        )
    }
}

1 Ответ

0 голосов
/ 10 марта 2020

У вас есть then(), который ничего не возвращает. Насколько я знаю, это означает, что вы принимаете обещание, которое ожидает await.

Насколько я понимаю, правильный способ написания этих запросов и обещаний:

async function authSwitch(cred) {

    var output;

    let querySnapshot = await firebase.firestore().collection('Students').where("uid", "==", cred).get();
    querySnapshot.forEach(function (doc) {
        output = "student";
    });

    querySnapshot = await firebase.firestore().collection('Admin').where("uid", "==", cred).get()
    querySnapshot.forEach(function (doc) {
        console.log(doc.id);
        output = "admin";
    });

    querySnapshot = await firebase.firestore().collection('Preceptors').where("uid", "==", cred).get();
    querySnapshot.forEach(function (doc) {
        output = "preceptor";
    });

    return output;
}
...