Firestore — получение данных из ссылки типа ‘collectionName/{id}’ и перебор полученного списка

#javascript #google-cloud-firestore

# #javascript #google-cloud-firestore

Вопрос:

Я пытаюсь получить все данные из справочного списка ‘anunturi_postate’. Переменная ‘post_data’, добавленная в список, выглядит нормально в цикле, но вне цикла список пуст.

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

введите описание изображения здесь

 // db = firebase.firestore()
async function postedByUser(){

    let query = await db.collection("users").doc($current_user.uid).get()

    let user_posts = []
    // anunturi_postate it's a field name which holds an array
    await query.data().anunturi_postate.forEach(async (doc) => {
        let post = await db.doc(doc.path).get()
        let post_data = await post.data() 
        console.log(post_data) // data looks ok
        user_posts.push(post_data)
    })

    console.log("user_posts:", user_posts) // here it's empty
    return user_posts
}

let user_posts 
postedByUser().then(data => {
    user_posts = data
})

// here it's empty
console.log("After func call: ", user_posts)
 

введите описание изображения здесь

Ответ №1:

async / await не работает внутри цикла forEach так, как вы ожидаете. Цикл не возвращает обещание, которое вы можете ожидать, и не завершится, прежде чем перейти к следующему коду. Вместо этого используйте цикл for. Кроме того, вы можете использовать каждую ссылку, как если бы это был объект DocumentReference.

     let user_posts = []
    const array = query.data().anunturi_postate
    for (let ref of array) {
        let post = await ref.get()
        let post_data = await post.data() 
        console.log(post_data) // ok
        user_posts.push(post_data)
    })

    console.log("user_posts:", user_posts)