我正在编写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保存在列表中。
问题是,如果用户在购物篮中添加两个相同的设备,由于尚未进行第一次更新,此查询将命中两次相同的子设备(文档)。
我非常确定事务不会解决此问题,因为它仍然会命中相同的子设备(文档)并再次写入字段。
有人遇到过类似的问题吗?