如何对一系列更新实施回滚

时间:2019-04-26 16:59:54

标签: angular firebase

在一个文档列表上执行许多更新事务时,如果一个或多个文档未处于特定状态,则无法更新任何文档。最好的方法是什么

我需要更新集合中对另一个字段具有特定值的一组文档上的状态字段-称为“组”。我根据组字段查询集合,这将返回我用forEach遍历的快照列表。在每次迭代中,我都需要将文档的状态更新为新的状态-但前提是它已经具有特定的状态。如果不是,则该组中的所有文档都不必更新。 通常,这将需要某种回滚。 Firebase中似乎没有用于批处理或事务的回滚选项-我想知道以下内容是否有效。

在循环中,将更新添加到批处理中。如果在循环结束时都有效,则返回提交,否则发送回被拒绝的Promise。

问题是-离开批次是否可以接受还是有副作用?

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 :(得分:0)

您可以通过不提交就放弃批处理。那不是问题。您还可以通过简单地返回被拒绝的承诺(至少在常规JavaScript API上)来中止交易。