我有一个accounts
结构如下的收藏集:
现在,我有一个拥有两个帐户的用户:
如何查询以获取此用户的帐户并将其作为承诺的解决方案返回?
这是我尝试过的。它返回[]
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)
});
})
}
您只需要阅读一些文档,就无需使用事务。由于您要并行执行两个(或多个)异步方法,这些方法返回一个Promise(即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 => {
....
});
}
请注意,由于我不确定100%的情况以及您的情况,因此我对DocumentReference
s(即db.collection('users').doc(user_id)
和db.collection('accounts').doc(id)
)使用了“经典”定义。随心所欲地适应!this.ref
this.db
您也可以return new Promise((res, rej) => {})
根据需要对其进行重做,但是总体原理保持不变。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句