我有一个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)
});
})
}
答案 0 :(得分:1)
您不需要使用交易,因为您只是阅读一些文档。由于您要并行执行两个(或多个)异步返回承诺的方法(即帐户文档的两个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
,所以db.collection('users').doc(user_id)
(即db.collection('accounts').doc(id)
和this.ref
使用了“经典”定义, this.db
。随心所欲地适应!
您也可以根据需要使用return new Promise((res, rej) => {})
对其进行重做,但是总体原理保持不变。