What is the status of Weak References?
David Bruant
bruant.d at gmail.com
Sat Mar 2 03:47:51 PST 2013
Le 02/03/2013 12:11, Kevin Gadd a écrit :
> I don't understand how the requestAnimationFrame approach (to
> registering periodic callbacks) applies to scenarios where you want
> Weak References (for lifetime management) or to observe an object (for
> notifications in response to actions by other arbitrary code that has
> a reference to an object). These seem to be significantly different
> problems with different constraints.
It's not really about "periodic", but rather about the idea of a "one
time listener". The reason I talked about 60 frames per second is that
it's an event that's fired very often, so it may have a significant cost
something at runtime to conditionally re-register.
The general problem is to know when someone listening actually wants to
stop listening. Currently, the default of observing is "observe ad vitam
æternam" which obviously causes the issue of "what if actually it's been
long that we didn't want to observe?"
The "one time listener" approach is interesting, because it doesn't say
"observe ad vitam æternam", but rather "I'll call you only once, figure
out the rest on your own" (so, re-subscribe if that's what you want).
On the huge benefits of this approach, the problem of GC-ing observers
is completely solved by the API. Well, not exactly. Maybe you
registered, but don't care before the event happens, so your observer is
garbage until called once. But after the event happens, it can be released.
In a way, a one-time listener can be seen as an auto-wrapped (wrapped by
the event emitter, not the one who registered it) one-time reference
(very weak reference?).
> If anything, requestAnimationFrame is an example of an API that poorly
> expresses developer intent.
I've asked [1], we'll see. I'm not very interested in rAF specifically,
because I mostly agree with you that from all the code snippets I've
read and written, people re-subscribe unconditionally. Maybe some more
complex applications don't.
> Furthermore, the need to manually trigger further
> frame callbacks is error-prone - you are essentially offloading the
> cost of lifetime management onto the application developer
The lifetime management *is* on the application developer shoulders. It
always has and will always be. GC and weakrefs are just conveniences to
make this work (much!) easier. There are cases where a GC isn't
sufficient. There will always be cases where manual disposal will be
necessary. Even if the language gets WeakRefs.
When a developer wraps an object in a WeakRef before handing it to
observe an event, the developer is making a lifetime management decision.
> For this and other reasons, I
> would suggest that it is a horrible idea to use rAF as an example of
> how to design an API or solve developer problems - especially problems
> as important as those addressed by weak references.
I feel misintrepreted. There is a long way from my
"I won't say it's absolutely better than WeakRefs and it may not apply
to the data binding case (?), but it's an interesting pattern to keep in
mind."
and your intrepretation of my post.
I shared an idea that hadn't been shared yet on this thread. I didn't
say it would solve all problems. I've actually been careful to say that
it may not.
David
[1] http://lists.w3.org/Archives/Public/public-webapps/2013JanMar/0623.html
More information about the es-discuss
mailing list