Perché DutOMIC produce lo stesso ID temporaneo due volte di seguito quando Iterating?

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

  •  21-12-2019
  •  | 
  •  

Domanda

Questo produrrà due ID diversi, che è ottimo:

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

Ma tutto come il seguente (ho provato un sacco di idee finora) produrrà lo stesso ID due volte, che non è quello che voglio:

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

Tutti producono qualcosa come

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

Dove il numero prodotto è lo stesso per ogni chiamata.

Quello che voglio effettivamente è che le chiamate non producano un numero, in modo da poter solo aggiungere i dati prodotti tramite una transazione.

Qualche idea?

solo per essere chiaro, La documentazione dice ", ogni chiamata a tempid produce un temporaneo unicoID. "

[Modificato dopo il commento di @maxthoursie che repeat avrebbe avuto questo problema in ogni caso.]

È stato utile?

Soluzione

Usa

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

Considera che # ... sono macro di lettore, il che significa che il loro valore verrà risolto quando viene letta l'espressione che accade naturalmente solo una volta.Utilizzare il # ... Macro solo quando scrivi dati di transazione letterali (come uno schema).Utilizzare DATOMIC.API / TEMPID per generare tempids in runtime.

Altri suggerimenti

Poiché la ripetizione sta ripetendo il valore ottenuto dall'ID chiamando una volta.

Utilizzare ripetutamente invece.

Vedi esempi a http://clojuredocs.org/clojure_core/clojure.core/repeatedlyjex/A>

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top