У меня есть ряд обновлений, выполняемых по запросу сбора в пожарном хранилище, где каждому обновлению требуется доступ к текущим значениям.Я знаю, что транзакции являются атомарным способом выполнения этих обновлений, но возможно ли пакетировать эту серию обновлений?
В настоящее время я обновляю коллекцию следующим образом:
let query;
query = db.collection('focuses');
query = query.where('userId', '==', auth.currentUser.uid);
query = query.where('active', '==', true);
query.get().then(snapshot => {
const batch = db.batch();
snapshot.forEach(doc => {
batch.update(
db.collection('focuses').doc(doc.id),
{
active: false,
working: true,
time: doc.data().workPeriod * 60,
}
);
});
batch.commit().then(() => {
auth.signOut().catch(error => {
console.error(error);
});
}).catch(error => {
console.error(error);
});
});
Это работает, нодоступ к полю workPeriod
осуществляется вне транзакции, поэтому я понимаю, что он может быть уязвим для одновременного доступа.
Так можно ли выполнять транзакцию для каждого пакетного обновления?Если это не так, то является ли лучшим способом собрать каждый Promise
из серии транзакций и затем использовать Promise.all
для настройки обратного вызова, который будет вызываться после завершения серии транзакций?