لماذا ينتج عن البيانات نفس المعرف المؤقت مرتين على التوالي عند التكرار?

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

  •  21-12-2019
  •  | 
  •  

سؤال

سيؤدي ذلك إلى إنتاج معرفين مختلفين ، وهو أمر رائع:

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

ولكن أي شيء مثل ما يلي (حاولت الكثير من الأفكار حتى الآن) سوف تنتج نفس معرف مرتين ، وهو ليس ما أريد:

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

كل شيء تسفر عن شيء من هذا القبيل

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

حيث يكون الرقم الناتج هو نفسه لكل مكالمة.

ما أريده بالفعل هو أن المكالمات لا تنتج رقما على الإطلاق ، حتى أتمكن فقط من إضافة البيانات المنتجة عبر معاملة.

أي أفكار?

فقط لأكون واضحا, الوثائق يقول ، " كل مكالمة إلى تيمبيد تنتج معرف مؤقت فريد."

[تحرير بعد تعليق @ماكسثورسي أن repeat سيكون لديك هذه المشكلة في أي حال.]

هل كانت مفيدة؟

المحلول

استخدام

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

النظر في أن #...هي وحدات الماكرو القارئ وهذا يعني أن قيمتها سيتم حلها عند قراءة التعبير الذي يحدث بشكل طبيعي مرة واحدة فقط.استخدم #...ماكرو فقط عند كتابة بيانات المعاملات الحرفية (مثل المخطط).استخدم البيانات.أبي / تيمبيد لتوليد تيمبيد في وقت التشغيل.

نصائح أخرى

لأن التكرار يكرر القيمة التي حصلت عليها من معرف الاتصال مرة واحدة.

استخدم مرارا وتكرارا بدلا من ذلك.

انظر الأمثلة على http://clojuredocs.org/clojure_core/clojure.core/repeatedly

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top