Как осуществить откат на серию обновлений - PullRequest
0 голосов
/ 26 апреля 2019

При выполнении ряда транзакций обновления в списке документов, если один или несколько документов не находятся в определенном состоянии, ни одна из них не может быть обновлена. Каков наилучший способ сделать это

Мне нужно обновить поле состояния для набора документов в коллекции, которые имеют конкретное значение для другого поля - назовите его group. Я запрашиваю коллекцию на основе поля группы, это возвращает список снимков, который я повторяю с помощью forEach. На каждой итерации мне нужно обновлять статус документа до нового статуса - но только если он уже имеет определенный статус. Если это не так, то ни один из документов в группе не должен быть обновлен. Как правило, это потребует некоторого отката. Похоже, что нет опции отката для пакета или транзакций в Firebase - мне интересно, действительно ли следующее.

В цикле добавьте обновления в пакет. Если в конце цикла все верны, верните коммит, в противном случае отправьте обратно отклоненное обещание.

Вопрос в том, является ли партия такой приемлемой или есть побочные эффекты?

interface IDoc {
   Status: string,
   Time: any
}

async processBatch(group:string) : Promise<void>
{
  const batch = this.afs.firestore.batch();
  let snapshot = await this.afs.collection('Docs', ref => ref.where('Group', '==', gropup).get().toPromise();
  let valid:boolean = true;
  snapshot.forEach(item => {
    const doc = item.data() as IDoc;
    if (valid && doc.Status === 'Complete') {
      batch.update(item.ref, {Status: 'Approve', Time: firestore.FieldValue.serverTimestamp()});
    }
    else {
       valid = false;
    }
  });
  return valid ? batch.commit() : Promise.reject();
}

1 Ответ

0 голосов
/ 26 апреля 2019

Вы можете отказаться от партии, просто не совершая ее.Это не проблема.Вы также можете прервать транзакцию, просто вернув отклоненное обещание (по крайней мере, в обычном JavaScript API).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...