Моя асинхронная функция не ждет обещания от Firebase - PullRequest
1 голос
/ 09 ноября 2019

В настоящее время я изучаю, как работает асинхронность, работая над небольшим проектом с использованием баз данных Firebase. Насколько я понимаю, ожидание должно приостановить функцию, пока обещание не будет выполнено, но в моем случае это не ждет этого.

Я сократил 2 функции, которые я использовал, чтобы попытаться проверить это:

async findUser(id) {
        await this.firebase.findUserData(id).then(
            value => {
                console.log('finduser stopped waiting');
                return value;
            }
        )
    }
async findUserData(userId){
        console.log('firebase started looking for user');
        firebase.database().ref('/users/' + userId).once('value').then(function(snapshot){
            let user = (snapshot.val());
            console.log('found: ' + user);
            return user;
        });
    }

Вывод на консоль выглядит следующим образом: (пока не разрешено вставлять изображения)

Сначала запускается findUser, затем следует вызов Firebase, но он не ждет завершения этого обещания, прежде чем вернуть значение. Найденные распечатки идентификатора пользователя были последними.

Я уверен, что я делаю что-то действительно глупое здесь, но я не мог понять это какое-то время и больше некому обратиться к.

Извините, если вопрос плохо написан. Первый раз выкладываю здесь. Приветствую любые отзывы!

1 Ответ

3 голосов
/ 09 ноября 2019

Вы не должны смешивать await и then с. Тогда вы также не забудьте дождаться обещания (вы никогда не дождетесь / не вернете обещание, возвращенное .once):

async findUserData(userId){
    console.log('firebase started looking for user');
    const snapshot = await firebase.database().ref('/users/' + userId).once('value');
    let user = (snapshot.val());
    console.log('found: ' + user);
    return user;
}

async findUser(id) {
    const value = await this.firebase.findUserData(id);
    console.log('finduser stopped waiting');
    return value;
}
...