¿Por qué Datomic de producir el mismo ID temporal dos veces en una fila cuando la iteración?

StackOverflow https://stackoverflow.com//questions/20015996

  •  21-12-2019
  •  | 
  •  

Pregunta

Esto va a producir dos diferentes números de identificación, lo cual es genial:

#db/id[:db.part/user]
#db/id[:db.part/user]

pero nada como el siguiente (he intentado un montón de ideas hasta el momento), se producirá el mismo id dos veces, que no es lo que quiero:

(repeatedly 2 (fn [] #db/id[:db.part/user]))
(for [n [1 2]] #db/id[:db.part/user])

Todos dan algo como

(#db/id[:db.part/user -1000774] #db/id[:db.part/user -1000774])

donde el número generado es el mismo para cada llamada.

Lo que yo realmente quiero es que las llamadas a NO producir un número, así que sólo puedo añadir el producido de datos a través de una transacción.

Alguna idea?

Para ser claros, la documentación dice, "Cada llamada a tempid produce un único id temporal."

[Editado después de comentario por @maxthoursie que repeat sería tener este problema, en cualquier caso.]

¿Fue útil?

Solución

Uso

(require '[datomic.api :as d])
(repeatedly 2 #(d/tempid :db.part/user))
;; => (#db/id[:db.part/user -1000118] #db/id[:db.part/user -1000119])

Considere la posibilidad de que #...están lector de macros lo que significa que su valor será resuelto cuando la expresión se lee lo que naturalmente sucede sólo una vez.Usar el #...macro sólo cuando usted está escribiendo literal de los datos de la transacción (como un esquema).Uso datomic.api/tempid para generar tempids en tiempo de ejecución.

Otros consejos

Porque repetir se repite el valor que recibió de identificador de llamada una vez.

Utilizar en varias ocasiones en su lugar.

Consulte los ejemplos en http://clojuredocs.org/clojure_core/clojure.core/repeatedly

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top