在Firestore中更新库存状态

时间:2018-06-20 08:36:41

标签: angular firebase google-cloud-firestore angularfire2 angular6

我正在编写Angular 6 / Firestore应用程序,用户可以在其中浏览各种设备并选择一些设备放入购物篮。

在Firestore中,我有一组设备,其中每个设备(文档)都有一组子设备(文档)。

子设备:

subdevice:{ available:true, unavailable:false, ... }

让我们说我目前在清单中有4个“设备A”,因此“设备A”有4个子设备。

用户在购物篮中添加了2个“设备A”并签出。

在结帐时,我想更新购物篮中每个设备的可用性。

现在,我以为我可以做到的方式是这样的:

(为了简化起见,我省略了构造函数,在其中初始化了firestore)

reserveDevices(devices: Device[]): Promise<string[]> {
    return new Promise(() => {
      const promises = [];
      const subids: string[] = [];

      devices.forEach((d) => {
        const deviceref = this.firestore.collection('devices')
        .doc(d.model).collection('subdevices').ref;
        promises.push(
          deviceref
          .where('available', '==', true)
          .where('unavailable', '==', false)
          .limit(1)
          .get().then((qs) => {
            // update the subdevice here
          })
        );
      });

      Promise.all(promises).then(() => {
        resolve(subids);
      }).catch((error) => {
        reject(new Error(this.ERR_DEVICE_UNAVAIL));
      });
    });
  }

我要执行的操作是,找到第一个可用的设备,将其设置为不可用,并将ID保存在列表中。

问题是,如果用户在购物篮中添加两个相同的设备,由于尚未进行第一次更新,此查询将命中两次相同的子设备(文档)。

我非常确定事务不会解决此问题,因为它仍然会命中相同的子设备(文档)并再次写入字段。

有人遇到过类似的问题吗?

0 个答案:

没有答案