Skip to content

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

@shen-tian

Description

@shen-tian

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": []
   }
}
  • @(subscribe [:fireabase/on-value {:path [:foo :bar]}]) first take the value [] when the subscription is first created, and then, once fetched from server, give "x".
  • @(subscribe [:fireabase/on-value {:path [:foo :baz]}]) first take the value [] when the subscription is first created, and remains that way as the empty array is fetched.
  • @(subscribe [:fireabase/on-value {:path [:foo :qux]}]) first take the value [] when the subscription is first created, and remains that way as it's detected as missing.

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

(make-reaction
(fn [] (get-in @app-db [::cache id] []))
:on-dispose #(do (.off ref "value" callback)
(>evt [::on-value-handler id nil]))))

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions