Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[Question] setting an empty object does not trigger any event handlers? #1319

Open
rozek opened this issue May 14, 2023 · 4 comments
Open

[Question] setting an empty object does not trigger any event handlers? #1319

rozek opened this issue May 14, 2023 · 4 comments

Comments

@rozek
Copy link

rozek commented May 14, 2023

Hello!

I'm currently trying to learn how to use Gun - please forgive me if my question turns out to be nonsense (or has been documented somewhere, but I missed that)

I know that setting a shared object triggers an event handler

let sharedData = Gun.get('sharingTest').get('sharedData')
sharedData.on((Data) => { console.log(JSON.stringified(Data)) }
sharedData.put('Test') // outputs "Test"

This works for null, booleans, numbers, strings and (non-empty) objects.

However, if I set an empty object, the event handler is not triggered

sharedData.put({}) // outputs nothing

Is this intended? sharedData seems to have been changed successfully, but I can't even retrieve this value using

Gun.get('sharingTest').get('sharedData').once((Data) => {
  console.log(JSON.stringified(Data)) // gets never called
})

which is strange since an empty object is still an object - and setting s.th. to null does very well trigger an event handler...

@rozek
Copy link
Author

rozek commented May 14, 2023

Ah, I got s.th.:

  • since Gun merges new values with existing ones, setting {} simply merges nothing - i.e., it leaves the existing object unchanged and, thus, does not invoke the event handler
  • what still surprises me, however, is the observation that the code
  const sharedData = Gun.get('sharingTest').get('sharedData')
    sharedData.put({})
  sharedData.on((Data) => { console.log('sharedData: "' + JSON.stringified(Data) + '"') })

sometimes writes onto the console, sometimes it doesn't (that's why I currently use this approach in my experiments in order to avoid the event handler being called initially, i.e., after loading previous contents from localStorage - which works most of the time...) are these "race conditions"?

Sorry for bothering you!

@rozek
Copy link
Author

rozek commented May 14, 2023

I'm completely lost...

what I did:

  • const sharedData = Gun.get('sharingTest').get('sharedData')
  • sharedData.put({ a:'a' }) - works
  • waiting for completion using a "once" event handler - works
  • sharedData.put(null) - works
  • waiting for completion using a "once" event handler - works
  • sharedData.put({ b:'b' }) - works
  • waiting for completion using a "once" event handler - oops

the last step shows that the previous contents (namely { a:'a' }) reappear again - although I previously successfully overwrote the node with a primitive!

How can that be? I am not yet using any relay - everything works locally only (albeit with "localStorage" in the background, if I understood the concepts correctly)

@amark
Copy link
Owner

amark commented May 21, 2023

{} is an empty set, so if it is merging into an existing object then no actual change occurs, however I do believe the lower level events get fired, but .on( etc. dedups it.

if you overwrite something with a primitive, then re-save an object to it... it'll re-generate the same deterministic soul on that path, thus it'll "re-find" the old data.

var newNode = gun.get("randomID").put({b: 'b'}); sharedData.put(newNode); will force a different node onto it, overwriting the previous and NOT re-merging with a previous node. But note: This can lead to disparity in offline apps if this happens a lot, as offline apps might not generate the same "location" to converge too.

@rozek
Copy link
Author

rozek commented May 21, 2023

Thank you very much for your explanation.

However, I somewhere found the "recipe" to first nullify an object and then to write a new one using the same context (I have to find where, but I'm really lost in the jungle of overlapping doc sections and wiki pages...). This recipe would contradict your explanation then.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants