es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

¿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?

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Parece que los dos métodos que ha implementado no son equivalentes. El primer método llama a clear() y luego a bulkAdd() en el mismo bloque then, mientras que el segundo método llama a clear() y luego a bulkAdd() en bloques pipe 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étodo bulkAdd() en el primer método, lo que podría estar causando el ConstraintError. Para asegurarse de que el método clear() se complete antes de que se llame al método bulkAdd(), se recomienda utilizar el segundo método.

Comments are closed.