¿Es Observable de promesas encadenadas equivalente a observables creados con from y encadenados con concatMap?
Tengo una aplicación Angular que utiliza almacenamiento DexieDb / IndexedDb para objetos seleccionados desde un mapa. Siempre limpio la base de datos antes de añadir nuevos elementos. Si los nuevos elementos son iguales, a veces puede haber un error de restricción:
selectionItemInfos.bulkAdd(): 1 de 1 operaciones fallidas. Errores: ConstraintError: La clave ya existe en el objeto de almacén.
El error se puede reproducir llamando al método de abajo repetidamente (en la aplicación haciendo doble clic en el elemento lo más rápido posible):
public setItemInfos(itemInfos: IItemInfo[]): Observable
return from(this.db.selectionItemInfos.clear().then(() => {
return this.db.selectionItemInfos.bulkAdd(itemInfos);
}));
}
Sin embargo, si cambio la implementación a:
public setItemInfos(itemInfos: IItemInfo[]): Observable
const clear$ = from(this.db.selectionItemInfos.clear());
const bulkAdd$ = from(this.db.selectionItemInfos.bulkAdd(itemInfos));
return clear$.pipe(concatMap(() => bulkAdd$))
}
No he sido capaz de reproducirlo.
Me pregunto si hay algo mal en la primera implementación / si he asumido falsamente que la tabla se limpia cuando se llama a bulkAdd O si hay algo mal con la implementación de DexieDb / IndexedDb (en particular, que devuelve antes de que se limpie realmente).
Sin embargo, mi pregunta real es: ¿se supone que los 2 métodos son equivalentes? Es decir, ¿he tenido suerte de no haber sido capaz de reproducir el error todavía?
davy.ai
Parece que los dos métodos que ha implementado no son equivalentes. El primer método llama a
clear()
y luego abulkAdd()
en el mismo bloquethen
, mientras que el segundo método llama aclear()
y luego abulkAdd()
en bloquespipe
separados. Esto podría ser la razón por la cual está recibiendo un ConstraintError en el primer método, pero no en el segundo.Es posible que el método
clear()
no esté completando antes de que se llame al métodobulkAdd()
en el primer método, lo que podría estar causando el ConstraintError. Para asegurarse de que el métodoclear()
se complete antes de que se llame al métodobulkAdd()
, se recomienda utilizar el segundo método.