deg / re-frame-firebase

Re-frame wrapper around Google's Firebase database
95 stars 32 forks source link

Telling the difference between a loading data, [], and, missing data #28

Open shen-tian opened 5 years ago

shen-tian commented 5 years ago

This is to do with the behaviour of the on-value sub:

Right now, if the realtime db looked like this:

{
   "foo": {
      "bar": "x",
      "baz": []
   }
}

The first case, where we know the data to be present, and not [], works fine for things like "loading" screens (i.e. Nine state of design stuff).

The second case doesn't work, as nothing changes between "loading" and "loaded and empty". We can avoid this in db schema design (i.e. use maps not vectors?).

The third case is more tricky, because you can't tell between "loading" and "missing".

Any ideas on how to proceed? I suspect that changing the default value on this line from [] to something else (::pending?) could be a solution, but would be a breaking change

https://github.com/deg/re-frame-firebase/blob/216595bab8e392caee1233a6480495d610b7a215/src/com/degel/re_frame_firebase/database.cljs#L63-L66

deg commented 5 years ago

Sorry for my long delay; I missed this message. I'm not actively working with Firebase right now, so I don't have much to add to your analysis. Have you gotten further in thinking about this?

shen-tian commented 5 years ago

It's been a while, but worth an update. This particular behaviour has caused quite a few bugs in our system in the last few month. We are dealing with it by explicitly checking for subscriptions deref-ing to []. This doesn't solve the "actually [] case, of course, but works in our system.

deg commented 5 years ago

My apologies. It will be at least another few weeks before I will be able to look at this project.