Как получить DocumentReferences в массиве внутри документа - PullRequest
0 голосов
/ 02 марта 2020

Очень новое ожидание / asyn c pattren в облачных функциях. Имейте облачные функции, которые выбирают данные из документа, который имеет массив DocumentReferences

/* Create  new Chilla for a given date  */
exports.createNewSalikChilla = functions.https.onRequest(async (req, res) => {
    const email=req.body.email;
    const date=req.body.date;

    console.log('Creating chilla for  Salik <' + email + '> on <' + date + '>');

    const db = admin.firestore();
    const habits = [];
    const salikRef = db.collection('saliks').doc(email);
    const salik = await salikRef.get();

    if (!salik.exists) {
        throw new Error("Salik not found for <" + email + ">");
    }

    const assignedHabits = salik.data()['assigned_habits'];

    assignedHabits.forEach(element => { 
       //LOST on how to get these Document Reference and push to habits = []
    });

    res.send({status: "Success"});
});

Документ в коллекции saliks имеет следующую структуру в firestore

assigned_habits<array>:
                        0:
                            habit<reference>: /habits/first
                            required<number>: 200
                        1:
                            habit<reference>: /habits/second
                            required<number>: 4
name: "Hani Q"

Но все перепробовал и я не могу понять, как использовать async / await здесь, чтобы получить все DocumementReferecnce из массива и pu sh в массив Habit, а затем, после того, как все сделано, я отправляю обратно res.send ({status: "Success" });

Ответ

Ниже работал после реализации принятого ответа

const assignedHabits = salik.data()['assigned_habits'];
const habits_data = (await Promise.all(assignedHabits.map(element => element.habit.get())))
                    .map(snapshot => snapshot.data());

console.log(habits_data);

res.send({status: habits_data});

1 Ответ

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

Всякий раз, когда вам нужно подождать кучу асинхронных операций, вы должны использовать Promise.all(). В вашем случае это будет выглядеть примерно так:

const assignedHabits = salik.data()['assigned_habits'];

const habits = await Promise.all(assignedHabits.map(element => element.habit.get()));

res.send({status: "Success"});

В приведенном выше коде предполагается, что habit - это тип поля DocumentReference.

...