получить список документов из пожарного магазина - PullRequest
0 голосов
/ 08 сентября 2018

У меня есть коллекция accounts, структурированная следующим образом:

enter image description here

Теперь у меня есть пользователь, которому принадлежат две учетные записи:

enter image description here

Как мне сделать запрос, чтобы получить учетную запись этого пользователя и вернуть ее в качестве разрешения обещания?

Вот что я пытался. Возвращает []

 getAccounts(user_id, userRef) {
        return new Promise((res, rej) => {
            this.db.runTransaction((transaction) => {
                return transaction.get(userRef.doc(user_id)).then((userDoc) => {
                    let accounts = []
                    if (!userDoc.exists) {
                        throw "User Document does not exist!";
                    }
                    let userData = userDoc.data()
                    let accountList = userData.accounts

                    for (var id in accountList){
                        transaction.get(this.ref.doc(id)).then(ans => {
                            accounts.push(ans.data())
                        }).catch(e => {
                            console.log(e)

                        })
                    }
                    return accounts
                }).then(function (ans) {
                    res(ans)
                }).catch((e) => {
                    console.log(e)
                });
            }).catch(function (err) {
                console.error(err);
                rej(err)
            });

        })
    }

1 Ответ

0 голосов
/ 08 сентября 2018

Вам не нужно использовать транзакцию, поскольку вы просто читаете некоторые документы. Поскольку вы хотите параллельно выполнять два (или более) асинхронных метода, которые возвращают обещание (т.е. два get() для документов по учетным записям), вы должны использовать Promise.all().

Должно работать что-то вроде следующего:

getAccounts(user_id, userRef) {
   return db.collection('users').doc(user_id).get()  //replaced since I am not sure what is this.db in your case
   .then(userDoc => {
       const promises = []
       if (!userDoc.exists) {
           throw "User Document does not exist!";
       }
       let userData = userDoc.data()
       let accountList = userData.accounts

       for (var id in accountList){
           promises.push(db.collection('accounts').doc(id).get())
       })
       return Promise.all(promises)
   })
   .then((results) => {
       return results.map(doc => doc.data());
    })
    .catch(err => {
        ....
    });
 }

Обратите внимание, что я использовал "классическое" определение для DocumentReference s (то есть db.collection('users').doc(user_id) и db.collection('accounts').doc(id)), так как я не уверен на 100%, что такое this.ref и this.db в вашем случае. Просто адаптируйся как хочешь!

Вы также можете переработать его с помощью return new Promise((res, rej) => {}), как пожелаете, но общая философия остается прежней.

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