<div dir="ltr"><div dir="ltr">Ron Buckton has a proposal that's quite similar to what you're talking about: <a href="https://github.com/tc39/proposal-using-statement">https://github.com/tc39/proposal-using-statement</a><br><div><div><div><br><div class="gmail_quote"><div dir="ltr">On Mon, Oct 15, 2018 at 11:40 AM Dan Aprahamian <<a href="mailto:dan.aprahamian@gmail.com">dan.aprahamian@gmail.com</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><div dir="ltr">Hello all! First time posting here. I was curious if there was ever talk about adding something similar to python's with syntax to JS. Obviously we already have a "with" keyword, but I figure we could probably use "use" as the keyword instead. I was thinking something like<div><br></div><div><font face="monospace">// Some user defined resource that can be "entered" and "exited"</font></div><div><font face="monospace">class MyResource {</font></div><div><font face="monospace">  // Function called when entered</font></div><div><font face="monospace">  async [Symbol.enter]() {</font></div><div><font face="monospace">  }</font></div><div><font face="monospace"><br></font></div><div><font face="monospace">  // Function called when exited</font></div><div><font face="monospace">  [Symbol.exit]() {</font></div><div><font face="monospace">  }</font></div><div><font face="monospace">}</font></div><div><font face="monospace"><br></font></div><div><font face="monospace">const resource = new MyResource();</font></div><div><font face="monospace"><br></font></div><div><font face="monospace">async function useResource() {</font></div><div><font face="monospace">  use myResource {</font></div><div><font face="monospace">    // Inside here, resource has had "acquire" called on it</font></div><div><font face="monospace"><br></font></div><div><font face="monospace">    await doSomethingAsync();</font></div><div><font face="monospace">    // Once this block is finished executing (including async)</font></div><div><font face="monospace">    // release is called</font></div><div><font face="monospace">  }</font></div><div><font face="monospace">  // Release has been called now</font></div><div><font face="monospace">}</font></div><div><font face="monospace"><br></font></div><div>Use would effectively be the equivalent of:</div><div><br></div><div><font face="monospace">async function use(resource, body) {</font></div><div><font face="monospace">  await resource[Symbol.enter]();</font></div><div><font face="monospace">  try {</font></div><div><font face="monospace">    await body();</font></div><div><font face="monospace">  } finally {</font></div><div><font face="monospace">    await resource[Symbol.exit]();</font></div><div><font face="monospace">  }</font></div><div><font face="monospace">}</font></div><div><br></div><div>Has something like this been considered before?</div><div><br></div><div>Thanks,</div><div>Dan</div></div>
_______________________________________________<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>
</blockquote></div></div></div></div></div></div>