我正在尝试使用同一集合中的读取值来更新触发onUpdate云功能的同一文档。 这是使用Flutter开发的一种聊天应用程序,其中先前对查询的回复被复制到现在正在更新的文档中,以便在应用程序中更轻松地显示。
该代码确实有效,但是当用户快速响应两个单独的查询时,他们都读取相同的最新响应,因此设置了相同的previousResponse。这一定要归因于flutter和/或云函数的异步特性,但是我无法弄清楚在哪里等待,或者是否有更好的方法来创建该函数,因此它永远不会为同一用户触发onUpdate,直到前一个触发器完成。 最后一部分听起来也像个坏主意。
到目前为止,我尝试将读取/更新保留在事务中,但是,这似乎仅适用于单个函数调用,而不是异步的。 还认为我可以通过读取客户端上事务中的上一个响应来解决此问题,但是,当不使用服务器API时,firebase不允许从事务中的集合中进行读取。
async function setPreviousResponseToInquiry(
senderUid: string,
recipientUid: string,
inquiryId: string) {
return admin.firestore().collection('/inquiries')
.where('recipientUid', '==', recipientUid)
.where('senderUid', '==', senderUid)
.where('responded', '==', true)
.orderBy('modified', 'desc')
.limit(2)
.get().then(snapshot => {
if (!snapshot.empty &&
snapshot.docs.length >= 2) {
return admin.firestore()
.doc(`/inquiries/${inquiryId}`)
.get().then(snap => {
return snap.ref.update({
previousResponse: snapshot.docs[1].data().response
})
})
}
})
}
答案 0 :(得分:0)
我看到了三种可能的解决方案:
随着它们逐渐参与其中,我会按上述顺序考虑/尝试它们。