How to make WatchQuery return "real" cache data instead of stale lastResult?

I’ve noticed that in some cases, after using writeFragment, while the cache item itself (e.g. todo:123) is updated with the new data, the queries still have stale data. Despite that those queries are indeed references pointing to e.g. todo:123.

After poking around a bit more I discovered a few things…

  • The data being served instead of the cache data is coming from the query’s lastResult
  • The fragment in question I was using writeFragment is fairly complex and can include arrays of references to other objects. The objects that returned correct, non-stale data from cache were always ones that included actual references to other objects. Whereas the ones that returned stale data from lastResult were ones that had an empty array, & thus no such references.

So my questions are…

  • Most importantly… how do I make it so my queries return the actual fresh cache data instead of the stale lastResult? Is there a way to prevent it from ever serving lastResult when cache data exists?
  • Fundamentally, is there something I’m missing here- why is it a thing to return lastResult instead of cache results at all? Why would any developer ever want Apollo to silently return a stale lastResult instead of a fresh cache result?
  • Why does the presence or absence of references to other object dictate whether Apollo serves fresh or stale data?
1 Like