Я пытаюсь запустить транзакцию в моем приложении firebase / angular 6, и оно не работает.
Вот что у меня есть:
try {
const transactionResult = await db.runTransaction(async trans => {
let groupRecords: any[] = [];
for (var i = 0; i < groupIDs.length; i++) {
const groupDocRef = db.collection('Groups').doc(groupIDs[i]);
const groupDoc = await trans.get(groupDocRef);
groupRecords.push(groupDoc);
}
for (var i = 0; i < groupRecords.length; i++) {
const groupData = groupRecords[i].data();
await trans.set(groupRecords[i].ref, groupData, {merge: true});
};
return trans.commit();
} catch (err) {
console.log('Error updating groups:', err);
return Promise.reject('Error updating groups: ' + err);
}
return trans.commit();
Проблема, с которой я столкнулся,что эта транзакция повторяется (на основе журналов консоли, которые я пропустил в приведенном выше фрагменте кода), а затем выдает ошибку: ссылка на транзакцию истек или больше не действительна.
Обычно, когда я делаю транзакцию, явернуть результаты trans.set (…), и это работает.На этот раз я не могу этого сделать.На этот раз я обновляю набор групп.Сначала я делаю все мои удары (в первом цикле for), а затем делаю все свои подходы (во втором цикле for).Я не возвращаю эти наборы, поскольку хочу, чтобы цикл for завершился для всех из них.Единственное, о чем я могу думать, когда наборы сделаны, это сделать коммит.Отсюда: return trans.commit()
.<- Но это, кажется, приводит к повторным запускам транзакции, завершающейся ошибкой. </p>
Как можно вернуть соответствующий объект в транзакции так, что транзакция работает (т.е. не повторяется, невыбросить истекшую / недопустимую ошибку, может откатиться, если что-то пойдет не так и т. д.), когда нужно было сделать несколько подходов?