Как вернуть обещания в al oop, не выходя из l oop? - PullRequest
0 голосов
/ 11 апреля 2020

У меня есть эта очень грязная функция Firebase.

exports.getAverage = functions.firestore
    .document('users/{userId}/days/{day}')
    .onUpdate((snapshot, context) => {
        let averages = {};
        let temp = [];
        let dayRefDoc = admin.firestore().collection(`users/${context.params.userId}/days`)
        return dayRefDoc.get().then(inner => {
            console.log(inner.docs);
            for (doc of inner.docs) {
                console.log(doc);
                return doc.ref.collection('session').get().then(session => {
                    session.docs.forEach(doc => temp.push(parseInt(doc.data().duration)))
                })
            }
        }).then(() => {
            console.log(temp);
            averages["sessionTime"] = (temp.reduce(function (a, b) { return a + b; }, 0)) / temp.length;
            return admin.firestore().collection('users').doc(context.params.userId).get().then(inner => {
                return inner.ref.update({ averageSessionTime: averages.sessionTime })
            })
        })
    })

Идея в том, что каждый user в моей базе данных имеет вложенную коллекцию days, и каждый день имеет вложенную коллекцию, называемую session. Я хочу go просмотреть каждый session документ за все дни и подсчитать переменную с именем duration, а затем получить среднее значение всех длительностей за все сеансы за все дни.

Получение среднего значения не Это сложно. Я борюсь с обещаниями прямо сейчас. В частности, получение функции для итерации по каждому подколлекции days для конкретного пользователя. Мое решение сейчас работает для первого документа, по которому оно итерируется, но не извлекает следующий, предположительно, потому что doc.ref.collection('session').get().then() само по себе обещание, и я выполняю возврат этого обещания, которое заставляет его выйти из строя. for (doc of inner.docs) l oop.

Правильно ли я считаю, что это проблема? Я чувствую, что использование al oop для создания этих обещаний в любом случае является плохой идеей, так какова была бы предполагаемая практика для выполнения чего-то подобного?

1 Ответ

0 голосов
/ 11 апреля 2020

Я думаю, вы на правильном пути. Моя первая идея:

let docs = [];
for (doc of inner.docs) {
            console.log(doc);
            docs.append( doc.ref.collection('session').get() )
}
Promise.all(docs).then( values => {...} );

Таким образом, вы соберете все обещания в списке, подождите, пока все обещания не будут выполнены, и сделайте все, что захотите, с результатами.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...