【问题标题】:How to implement a rollback on a series of updates如何实现对一系列更新的回滚
【发布时间】:2019-04-26 16:59:53
【问题描述】:

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

我需要更新集合中一组文档的状态字段,这些文档具有另一个字段的特定值 - 将其称为组。我根据 group 字段查询集合,这将返回一个我用 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();
}

【问题讨论】:

    标签: angular firebase


    【解决方案1】:

    您可以通过不提交来放弃批处理。这不是问题。你也可以通过简单地返回一个被拒绝的承诺来中止事务(至少在普通的 JavaScript API 上)。

    【讨论】:

      猜你喜欢
      • 2018-12-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-02-06
      • 1970-01-01
      • 2019-01-23
      • 2018-06-27
      • 2015-03-24
      相关资源
      最近更新 更多