I am also still very interested in Weak references / a weak map, where
the values are held weakly. Here is my example: I want to easily build
caches, which lose their values, when there are no other references to
them. Example pseudo code (assuming server request answers synchronously
for simplicity):
var Cache = new WeakValueMap();
function request(Key) {
var CachedResult = Cache.get(Key);
if (CachedResult) return CachedResult;
var UnprocessedResult = doServerRequest(Key);
var BigProcessedObject = doVeryHeavyComputingTask(UnprocessedResult);
Cache.set(Key,BigProcessedObject);
return BigProcessedObject;
}
Thoughts:
- doHeavyComputingTask takes a long time, so it should be done only once
per key (until it is uncached)
- BigProcessedObject is really big, it shall be in memory at most once
at any time
- When the last reference to a BigProcessedObject is lost, it shall be
removed from cache to save memory
- removal could be delayed by holding a reference to a
BigProcessedObject and releasing it using a setTimeout-Timer.
Without WeakValueMap I have to build my own reference counting, so
everyone who requests the object for a Key has to "unrequest" it again,
else it would provoke a memory leak. This implies, that the life cycle
of an object is tracked, so each object, which has a reference to a
BigProcessedObject needs something like a destructor. As there is no
destructor in JS you have to write a method and manually call it. Thus
each object needs to have a single known owner or reference
counting/tracking has to be done for that object, too. This propagates
through your whole program. Finally as a developer you end up building
your own garbage collector, which:
- is error prone
- consumes extra memory, as there are already all structures present for
garbage collecting in the JS engine, just it is not usable
- takes up lots of time for development and debugging
So it is a/the classical example case for
https://github.com/tc39/proposal-weakrefs
On 21.03.2017 08:34, T.J. Crowder wrote:
What are your use cases for it?
Rather than tying it to being a `Map`, I'd prefer to see something
like Java's [`WeakReference`][1]: You could store the
`WeakReference`s in a `Map` if you wanted strongly-referenced keys
with weakly-referenced values.
-- T.J. Crowder
[1]:
http://docs.oracle.com/javase/8/docs/api/java/lang/ref/WeakReference.html
On Tue, Mar 21, 2017 at 6:15 AM, /#!/JoePea <[email protected]
<mailto:[email protected]>> wrote:
Hey all,
I'd like to have something like a WeakMap where the keys can be
primitives and the values are weakly-held Objects, so if there are
no more references to any of the Object values that the entry gets
removed from the map.
For example, it might look like this:
```
{
["foo"] => SomeObject,
["
bar
"] =>
OtherObject
,
}
```
where if there are no more references to `OtherObject`, then
`['bar'] => OtherObject` is removed from the map.
Usage would be very similar to WeakMap, like
```
let m = new ReversedWeakMap
m.add('foo', SomeObject)
m.add('
bar
',
OtherObject
)
console.log(m.get('bar')) // OtherObject
... time passes, no more references to OtherObject, OtherObject is
collected ...
console.log(m.get('bar')) // undefined
```
I thought of using WeakMap values as keys, and vice versa, but it
seems to be impossible.
I guess maybe it is difficult to add this natively because it
would mean that GC needs to be completely deterministic as far as
JS programs go. For example:
```js
let m = new ReversedWeakMap
function main() {
m.set('foo', {})
console.log(m.get('foo')) // {}
}()
main()
// GC would have to be guaranteed to have happened at this point.
console.log(m.get('foo')) // undefined
```
*/#/!//*JoePea
_______________________________________________
es-discuss mailing list
[email protected] <mailto:[email protected]>
https://mail.mozilla.org/listinfo/es-discuss
<https://mail.mozilla.org/listinfo/es-discuss>
_______________________________________________
es-discuss mailing list
[email protected]
https://mail.mozilla.org/listinfo/es-discuss
--
Michael Kriegel • Head of R&D • Actifsource AG • Haldenstrasse 1 • CH-6340 Baar
• www.actifsource.com • +41 56 250 40 02
_______________________________________________
es-discuss mailing list
[email protected]
https://mail.mozilla.org/listinfo/es-discuss