<br><br><div class="gmail_quote"><div dir="ltr">On Wed, Nov 29, 2017, 19:19 /#!/JoePea <<a href="mailto:joe@trusktr.io">joe@trusktr.io</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div dir="ltr"><div class="gmail_default" style="font-family:georgia,serif;font-size:small;color:#000000">Hello all, I'm posting here because I'm thinking about how not to leak memory, and wondering if I am.</div><div class="gmail_default" style="font-family:georgia,serif;font-size:small;color:#000000"><br></div><div class="gmail_default" style="font-family:georgia,serif;font-size:small;color:#000000">Suppose I have an object that is cleaned up (GC'd), and that object's constructor (for example) ran an anonymous function that listened to a Promise. For exampel:</div><div class="gmail_default" style="font-family:georgia,serif;font-size:small;color:#000000"><br></div><div class="gmail_default" style="font-family:georgia,serif;font-size:small;color:#000000">```js</div><div class="gmail_default" style="font-family:georgia,serif;font-size:small;color:#000000">class Foo {</div><div class="gmail_default" style="font-family:georgia,serif;font-size:small;color:#000000">  constructor() {</div><div class="gmail_default" style="font-family:georgia,serif;font-size:small;color:#000000">    // ...</div><div class="gmail_default" style="font-family:georgia,serif;font-size:small;color:#000000">    this.somePromise.then(() => {console.log('this will never fire if this object is GC'd')})</div><div class="gmail_default" style="font-family:georgia,serif;font-size:small;color:#000000">  }</div><div class="gmail_default" style="font-family:georgia,serif;font-size:small;color:#000000">}</div><div class="gmail_default" style="font-family:georgia,serif;font-size:small;color:#000000">```</div><div class="gmail_default" style="font-family:georgia,serif;font-size:small;color:#000000"><br></div><div class="gmail_default" style="font-family:georgia,serif;font-size:small;color:#000000">Suppose that if this object gets collected, then it means that there is nothing in my application that will ever be able to resolve this object's `somePromise`.</div></div></blockquote></div><div class="gmail_quote"><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div dir="ltr"><div class="gmail_default" style="font-family:georgia,serif;font-size:small;color:#000000"><br></div><div class="gmail_default" style="font-family:georgia,serif;font-size:small;color:#000000">Does the engine also garbage collect `somePromise` and the attached handler?</div></div></blockquote></div><div><br></div><div>Yes, provided nothing else is referencing it.</div><div><br></div><div class="gmail_quote"><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div dir="ltr"><div class="gmail_default" style="font-family:georgia,serif;font-size:small;color:#000000"><br></div><div class="gmail_default" style="font-family:georgia,serif;font-size:small;color:#000000">Now, what if `somePromise` is referenced outside of this object by some other code waiting on yet another promise who's handler will resolve this object's `somePromise`? Does this prevent the object from being GC'd? Or is the object GC'd, but `somePromise` is not and the above console.log should still fire at some point (or memory will be leaked)?</div><div class="gmail_default" style="font-family:georgia,serif;font-size:small;color:#000000"></div></div></blockquote></div><div><br></div><div>The object itself is GC'd independently of its members absent a circular reference.</div><div><br></div><div>A thing to keep in mind is that a promise could still be referenced by its resolving functions, even if the promise itself is no longer referenced by ECMAScript code. This keeps the promise state alive, so it can still fire (otherwise, you'd have observable GC). So, in this example, things will still fire regardless:</div><div><br></div><div>```js<br>function foo() {<br>    let p = new Promise(resolve => {<br>        setTimeout(resolve, 1000)</div><div>    })</div><div><br></div><div>    p.then(() => {</div><div>        console.log("This still fires")<br>    })</div><div><br></div><div>    // `p` is no longer referenced by the</div><div>    // calling function, but it's still referenced</div><div>    // by the enqueued `setTimeout` task, so</div><div>    // it can't be collected<br>}</div><div><br></div><div>foo()</div><div>```</div><div><br></div><div class="gmail_quote"><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div dir="ltr"><div class="gmail_default" style="font-family:georgia,serif;font-size:small;color:#000000"><br></div></div><div class="gmail_extra"><br clear="all"><div><div class="m_7193785789534646703gmail_signature" data-smartmail="gmail_signature"><div dir="ltr"><b style="font-size:12.8px">/#<i>!</i>/</b><font face="courier new, monospace" style="font-size:12.8px">JoePea</font><br></div></div></div>
<br><div class="gmail_quote">On Thu, Jan 12, 2017 at 1:12 PM, Isiah Meadows <span dir="ltr"><<a href="mailto:isiahmeadows@gmail.com" target="_blank">isiahmeadows@gmail.com</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><p dir="ltr">And that's why we're waiting on the next meeting to happen with notes posted, so we can figure out what to do next. It's likely to get discussed, especially considering the current situation and pressing need for it. </p><div class="m_7193785789534646703HOEnZb"><div class="m_7193785789534646703h5">
<br><div class="gmail_quote"><div dir="ltr">On Thu, Jan 12, 2017, 13:27 Jordan Harband <<a href="mailto:ljharb@gmail.com" target="_blank">ljharb@gmail.com</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div dir="ltr" class="m_7193785789534646703m_803689613153488643gmail_msg">The Cancellable Promises proposal itself is currently withdrawn, but don't forget that all of the previous discussion on cancellation in promises led to that proposal.<div class="m_7193785789534646703m_803689613153488643gmail_msg"><br class="m_7193785789534646703m_803689613153488643gmail_msg"></div><div class="m_7193785789534646703m_803689613153488643gmail_msg">It would be shortsighted to pretend they don't exist, or that the spec proposal won't matter forever to any other cancellation proposal, and doing so won't help any alternative proposal.</div></div><div class="gmail_extra m_7193785789534646703m_803689613153488643gmail_msg"><br class="m_7193785789534646703m_803689613153488643gmail_msg"><div class="gmail_quote m_7193785789534646703m_803689613153488643gmail_msg">On Thu, Jan 12, 2017 at 7:44 AM, Jan-Ivar Bruaroey <span dir="ltr" class="m_7193785789534646703m_803689613153488643gmail_msg"><<a href="mailto:jib@mozilla.com" class="m_7193785789534646703m_803689613153488643gmail_msg" target="_blank">jib@mozilla.com</a>></span> wrote:<br class="m_7193785789534646703m_803689613153488643gmail_msg"><blockquote class="gmail_quote m_7193785789534646703m_803689613153488643gmail_msg" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Cancellable promises is dead. Please don't hijack this thread discussing them.<br class="m_7193785789534646703m_803689613153488643gmail_msg">
<br class="m_7193785789534646703m_803689613153488643gmail_msg">
Thanks,<br class="m_7193785789534646703m_803689613153488643gmail_msg">
<br class="m_7193785789534646703m_803689613153488643gmail_msg">
.: Jan-Ivar :.<div class="m_7193785789534646703m_803689613153488643m_-4696406863400842682HOEnZb m_7193785789534646703m_803689613153488643gmail_msg"><div class="m_7193785789534646703m_803689613153488643m_-4696406863400842682h5 m_7193785789534646703m_803689613153488643gmail_msg"><br class="m_7193785789534646703m_803689613153488643gmail_msg">
<br class="m_7193785789534646703m_803689613153488643gmail_msg">
_______________________________________________<br class="m_7193785789534646703m_803689613153488643gmail_msg">
es-discuss mailing list<br class="m_7193785789534646703m_803689613153488643gmail_msg">
<a href="mailto:es-discuss@mozilla.org" class="m_7193785789534646703m_803689613153488643gmail_msg" target="_blank">es-discuss@mozilla.org</a><br class="m_7193785789534646703m_803689613153488643gmail_msg">
<a href="https://mail.mozilla.org/listinfo/es-discuss" rel="noreferrer" class="m_7193785789534646703m_803689613153488643gmail_msg" target="_blank">https://mail.mozilla.org/listinfo/es-discuss</a><br class="m_7193785789534646703m_803689613153488643gmail_msg">
</div></div></blockquote></div><br class="m_7193785789534646703m_803689613153488643gmail_msg"></div>
_______________________________________________<br class="m_7193785789534646703m_803689613153488643gmail_msg">
es-discuss mailing list<br class="m_7193785789534646703m_803689613153488643gmail_msg">
<a href="mailto:es-discuss@mozilla.org" class="m_7193785789534646703m_803689613153488643gmail_msg" target="_blank">es-discuss@mozilla.org</a><br class="m_7193785789534646703m_803689613153488643gmail_msg">
<a href="https://mail.mozilla.org/listinfo/es-discuss" rel="noreferrer" class="m_7193785789534646703m_803689613153488643gmail_msg" target="_blank">https://mail.mozilla.org/listinfo/es-discuss</a><br class="m_7193785789534646703m_803689613153488643gmail_msg">
</blockquote></div>
</div></div><br>_______________________________________________<br>
es-discuss mailing list<br>
<a href="mailto:es-discuss@mozilla.org" target="_blank">es-discuss@mozilla.org</a><br>
<a href="https://mail.mozilla.org/listinfo/es-discuss" rel="noreferrer" target="_blank">https://mail.mozilla.org/listinfo/es-discuss</a><br>
<br></blockquote></div><br></div>
</blockquote></div>