Я пытаюсь обновить тот же документ, который вызвал облачную функцию onUpdate, значением чтения из той же коллекции.
Это приложение для чата, созданное во Flutter, где предыдущий ответ на запрос реплицируется в обновляемый документ, чтобы его было проще увидеть в приложении.
Код работает, однако, когда пользователь быстро отвечает на два отдельных запроса, они оба читают один и тот же последний ответ, устанавливая тот же предыдущий ответ. Это должно быть связано с асинхронной природой трепетания и / или облачной функции, но я не могу понять, где ждать или есть лучший способ сделать функцию, поэтому она никогда не вызывает onUpdate для того же пользователя, пока предыдущий триггер не закончен.
Последняя часть также звучит как плохая идея.
До сих пор я пытался привязать чтение / обновление к транзакции, однако, похоже, это работает только для одного вызова функции, а не тогда, когда они асинхронны.
Также решил, что я мог бы это исправить, прочитав предыдущий ответ в транзакции на клиенте, однако Firebase не позволяет читать из коллекции в транзакции, когда не используется серверный API.
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
})
})
}
})
}