Как ждать завершения QueryDocumentSnapshot.docs.forEach для возврата - PullRequest
0 голосов
/ 23 марта 2020

Я использую Firestore, чтобы получить все документы из коллекции. Я хочу дождаться возвращения всех документов из базы данных, чтобы вернуть функцию. Этот возврат должен быть массивом документов, полученных из коллекции. В данный момент моя консоль просто печатает переменную Promise.

var getUsersSnapshot = async function() {
        var db = firebase.firestore()
        const usersSnapshot = await firebase
            .firestore()
            .collection("users")
            .get();
        var users = []
        await usersSnapshot.docs.forEach(element => {
            users.push(element.data())            
        });
        return users
}

var getMonthlyByUserId = function () {
    var users = getUsersSnapshot()
    console.log(users)
    return new Promise((resolve, reject) => {
        resolve()
    })
}

Значение, записанное на консоли:

enter image description here

На консоли я вижу Обещание, но я ожидал, что массив значений.

Ответы [ 2 ]

1 голос
/ 23 марта 2020

Поскольку getUsersSnapshot - это функция async, вам нужно использовать await при ее вызове.

var getMonthlyByUserId = async function () {
    var users = await getUsersSnapshot()
    console.log(users)
    return users;
}

Вся конструкция с Promise, которую вы делаете, кажется ненужной, так как возврат значение уже обещано.


Ваш getUsersSnapshot выглядит необычно для меня. Как правило, я ожидал увидеть, что написано как:

var getUsersSnapshot = async function() {
    const usersSnapshot = await firebase
        .firestore()
        .collection("users")
        .get();
    var users = usersSnapshot.docs.map(element => element.data());
    return users
}
0 голосов
/ 23 марта 2020

Вы можете использовать then(), чтобы получить значение из Promise:

var getMonthlyByUserId = function () {
    getUsersSnapshot().then((values) =>{
   console.log(values);
 });    
}
...