<div dir="ltr">To illustrate that, I went to <a href="https://github.com/search?l=JavaScript&q=await&ref=simplesearch&type=Repositories&utf8=%E2%9C%93">Github</a>, I looked for repositories that match "await" and are JS (471 repositories). The first few hits where microframeworks with minimal code or language parser, but then comes:<div><br></div><div><a href="https://github.com/FredericHeem/starhackit/tree/master/client/src">Starhackit</a> (3rd search result hit) some kind of full-stack application framework):</div><div><ul><li><a href="https://github.com/FredericHeem/starhackit/blob/master/client/src/app/index.js#L16">client/src/app/index.js</a>: async function run(), defers to await app.start</li><li><a href="https://github.com/FredericHeem/starhackit/blob/master/client/src/app/app.js#L76">client/src/app/app.js</a>: async start(), defers to Promise.all of ii18nInit and preAuth</li><ul><li>async i18nInit, defers to await intl</li><li>async preAuth, defers to await parts.auth.stores().me.fetch()</li></ul></ul><div>And so on. I could go through most of these non minimal code repositories, and show you how every single one of them has async/await proliferated through their entire call chain top to bottom.</div></div><div><br></div><div>I hope you can understand that my "theory" on actual use is therefore not just idle speculation, it's actual use reality, and you should consider that.</div><div><br></div></div><div class="gmail_extra"><br><div class="gmail_quote">On Sun, Feb 26, 2017 at 1:43 PM, Florian Bösch <span dir="ltr"><<a href="mailto:pyalot@gmail.com" target="_blank">pyalot@gmail.com</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div dir="ltr">It would be nice if there even was an argument, but there isn't. There isn't because async/await naturally devolves into implicit coroutines, so any argument would be moot.<div><br></div><div>To illustrate, suppose you have these 4 functions:</div><div><br></div><blockquote style="margin:0px 0px 0px 40px;border:none;padding:0px"><div><font face="monospace, monospace" size="1">let a = function(){</font></div><div><font face="monospace, monospace" size="1">  return b();</font></div><div><font face="monospace, monospace" size="1">}</font></div><div><font face="monospace, monospace" size="1"><br></font></div><div><font face="monospace, monospace" size="1">let b = function(){</font></div><div><font face="monospace, monospace" size="1">  return c();</font></div><div><font face="monospace, monospace" size="1">}</font></div><div><font face="monospace, monospace" size="1"><br></font></div><div><font face="monospace, monospace" size="1">let c = function(){</font></div><div><font face="monospace, monospace" size="1">   return d();</font></div><div><font face="monospace, monospace" size="1">}</font></div><div><font face="monospace, monospace" size="1"><br></font></div><div><font face="monospace, monospace" size="1">let d = function(){</font></div><div><font face="monospace, monospace" size="1">  return whatever();</font></div><div><font face="monospace, monospace" size="1">}</font></div></blockquote><div><br></div><div>Call chains like this are typical. It's the staple of software engineering (for reasons of proper separation of concerns, reuse of utility code, etc.). If you believe that there is an argument about this being exemplary, it would be impossible to have an argument with you about software engineering at all. Of course real-world examples are more complex and don't just return whatever the underlying function produced, but as a control flow example it suffices. These chains are often much deeper than 4 levels, it's not uncommon to encounter call chains 10, 15, 20 or 30 layers deep.</div><div><br></div><div>Now let's suppose you figure that function d wants to do something asynchronous.</div><div><br></div><div>So you go and do:</div><div><br></div><blockquote style="margin:0px 0px 0px 40px;border:none;padding:0px"><div><div><font face="monospace, monospace" size="1">let d = function(){</font></div></div><div><div><font face="monospace, monospace" size="1">  return xhr();</font></div></div><div><div><font face="monospace, monospace" size="1">}</font></div></div></blockquote><div><br></div><div>But of course that doesn't work, because d is not async. So you go and do:</div><div><br></div><div><div><font face="monospace, monospace" size="1">let d = async function(){</font></div><div><font face="monospace, monospace" size="1">  return await xhr();</font></div><div><font face="monospace, monospace" size="1">}</font></div></div><div><br></div><div>Of course that doesn't work because c is not async, and so forth, so eventually your code looks like that.</div><div><br></div><blockquote style="margin:0px 0px 0px 40px;border:none;padding:0px"><div><div><font face="monospace, monospace" size="1">let a = async function(){</font></div></div><div><div><font face="monospace, monospace" size="1">  return await b();</font></div></div><div><div><font face="monospace, monospace" size="1">}</font></div></div><div><div><font face="monospace, monospace" size="1"><br></font></div></div><div><div><font face="monospace, monospace" size="1">let b = async function(){</font></div></div><div><div><font face="monospace, monospace" size="1">  return await c();</font></div></div><div><div><font face="monospace, monospace" size="1">}</font></div></div><div><div><font face="monospace, monospace" size="1"><br></font></div></div><div><div><font face="monospace, monospace" size="1">let c = async function(){</font></div></div><div><div><font face="monospace, monospace" size="1">   return await d();</font></div></div><div><div><font face="monospace, monospace" size="1">}</font></div></div><div><div><font face="monospace, monospace" size="1"><br></font></div></div><div><div><font face="monospace, monospace" size="1">let d = async function(){</font></div></div><div><div><font face="monospace, monospace" size="1">  return await xhr();</font></div></div><div><div><font face="monospace, monospace" size="1">}</font></div></div></blockquote><div><br></div><div>In essence, you've applied to following two regular expression: s/function/await function/g and s/.+?\(\)/await ()/ . Of course that'd be horrid to do, so in reality you'd please use a proper JS parser. How did your code look before you applied these regular expressions? Well, it looks exactly like at the start.</div><div><br></div><blockquote style="margin:0 0 0 40px;border:none;padding:0px"><div><div><font face="monospace, monospace" size="1">let a = function(){</font></div></div><div><div><font face="monospace, monospace" size="1">  return b();</font></div></div><div><div><font face="monospace, monospace" size="1">}</font></div></div><div><div><font face="monospace, monospace" size="1"><br></font></div></div><div><div><font face="monospace, monospace" size="1">let b = function(){</font></div></div><div><div><font face="monospace, monospace" size="1">  return c();</font></div></div><div><div><font face="monospace, monospace" size="1">}</font></div></div><div><div><font face="monospace, monospace" size="1"><br></font></div></div><div><div><font face="monospace, monospace" size="1">let c = function(){</font></div></div><div><div><font face="monospace, monospace" size="1">   return d();</font></div></div><div><div><font face="monospace, monospace" size="1">}</font></div></div><div><div><font face="monospace, monospace" size="1"><br></font></div></div><div><div><font face="monospace, monospace" size="1">let d = function(){</font></div></div><div><div><font face="monospace, monospace" size="1">  return xhr();</font></div></div><div><div><font face="monospace, monospace" size="1">}</font></div></div></blockquote><div><br></div><div>But it isn't like at the start, because now it can trigger race conditions and is asynchronous. It is in fact now idempotent with true co-routines, except some unnecessary code transmoglification.</div><div><br></div><div>This conclusively proves that await/async is an inconvenient clutch that naturally devolves into true co-routines. Now you might try to argue, that real-world code isn't just going to prefix every function call with await and every function body with async and stay that way.</div><div><br></div><div>However, this would be in invalid argument for actual real-world code, because. People don't just constantly switch back and forth and re-engineer their code just because they want something async to happen underneath. You don't go and bicycle repair every call and function definition if you should decide to toggle synchronous or asynchronous. Therefore, since prefixing everything works no matter if it is asynchronous or synchronous, you will stay with the prefixes once you've added them. Which not only guarantees that async/await devolves into true co-routines, but it also gurantees that they proliferate everything and once they're in, they're never going out.</div><div><br></div><div>And that's why it isn't an argument.</div></div><div class="HOEnZb"><div class="h5"><div class="gmail_extra"><br><div class="gmail_quote">On Sun, Feb 26, 2017 at 12:05 PM, Alexander Jones <span dir="ltr"><<a href="mailto:alex@weej.com" target="_blank">alex@weej.com</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div>Florian, you shouldn't pass the argument of explicit vs implicit coroutines off as being so simple. There are many compelling arguments for both! Please Google them!</div><div><br></div><div><br><div class="gmail_quote"><div><div class="m_-8915469981148999515h5"><div>On Sun, 26 Feb 2017 at 00:01, Florian Bösch <<a href="mailto:pyalot@gmail.com" target="_blank">pyalot@gmail.com</a>> wrote:<br></div></div></div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div><div class="m_-8915469981148999515h5"><div class="m_-8915469981148999515m_-2336174978307129080gmail_msg"><div class="gmail_extra m_-8915469981148999515m_-2336174978307129080gmail_msg"><div class="gmail_quote m_-8915469981148999515m_-2336174978307129080gmail_msg">On Sat, Feb 25, 2017 at 11:55 PM, Codefined <span class="m_-8915469981148999515m_-2336174978307129080gmail_msg"><<a href="mailto:codefined@debenclipper.com" class="m_-8915469981148999515m_-2336174978307129080gmail_msg" target="_blank">codefined@debenclipper.com</a>></span> wrote:<br class="m_-8915469981148999515m_-2336174978307129080gmail_msg"><blockquote class="gmail_quote m_-8915469981148999515m_-2336174978307129080gmail_msg" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div id="m_-8915469981148999515m_-2336174978307129080m_9192594920001276971m_4925540525995233245__MailbirdStyleContent" style="font-size:10pt;font-family:arial;color:#000000" class="m_-8915469981148999515m_-2336174978307129080gmail_msg"><p style="font-size:13.3333px" class="m_-8915469981148999515m_-2336174978307129080gmail_msg"><span style="font-size:13.3333px" class="m_-8915469981148999515m_-2336174978307129080gmail_msg">This seems to be so very confusing for anybody new studying this language, almost everyone I talk to gets stuck up on some part of it. </span></p></div></blockquote></div></div></div><div class="m_-8915469981148999515m_-2336174978307129080gmail_msg"><div class="gmail_extra m_-8915469981148999515m_-2336174978307129080gmail_msg"><div class="gmail_quote m_-8915469981148999515m_-2336174978307129080gmail_msg">Promises are bad, and mixing them with async/await is worse. Should never have been added to any kind of standard.</div></div></div><div class="m_-8915469981148999515m_-2336174978307129080gmail_msg"><div class="gmail_extra m_-8915469981148999515m_-2336174978307129080gmail_msg"><div class="gmail_quote m_-8915469981148999515m_-2336174978307129080gmail_msg"><blockquote class="gmail_quote m_-8915469981148999515m_-2336174978307129080gmail_msg" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div id="m_-8915469981148999515m_-2336174978307129080m_9192594920001276971m_4925540525995233245__MailbirdStyleContent" style="font-size:10pt;font-family:arial;color:#000000" class="m_-8915469981148999515m_-2336174978307129080gmail_msg"><div id="m_-8915469981148999515m_-2336174978307129080m_9192594920001276971m_4925540525995233245__MailbirdStyleContent" style="font-size:10pt;font-family:arial" class="m_-8915469981148999515m_-2336174978307129080gmail_msg"><div style="font-size:13.3333px" class="m_-8915469981148999515m_-2336174978307129080gmail_msg"><h2 class="m_-8915469981148999515m_-2336174978307129080gmail_msg"></h2><div class="m_-8915469981148999515m_-2336174978307129080m_9192594920001276971m_4925540525995233245highlight m_-8915469981148999515m_-2336174978307129080gmail_msg" style="background:rgb(248,248,248)"><pre style="line-height:16.6667px" class="m_-8915469981148999515m_-2336174978307129080gmail_msg">async <span style="color:rgb(0,128,0);font-weight:bold" class="m_-8915469981148999515m_-2336174978307129080gmail_msg">function</span> asyncFunction() {
<span style="color:rgb(0,128,0);font-weight:bold" class="m_-8915469981148999515m_-2336174978307129080gmail_msg">let</span> <span style="color:rgb(188,122,0)" class="m_-8915469981148999515m_-2336174978307129080gmail_msg">[</span>err, data<span style="color:rgb(188,122,0)" class="m_-8915469981148999515m_-2336174978307129080gmail_msg">]</span> <span style="color:rgb(102,102,102)" class="m_-8915469981148999515m_-2336174978307129080gmail_msg">=</span> await asyncFunction()
}</pre></div></div></div></div></blockquote></div></div></div><div class="m_-8915469981148999515m_-2336174978307129080gmail_msg"><div class="gmail_extra m_-8915469981148999515m_-2336174978307129080gmail_msg"><div class="gmail_quote m_-8915469981148999515m_-2336174978307129080gmail_msg"><div class="m_-8915469981148999515m_-2336174978307129080gmail_msg">function asyncFunction(){</div><div class="m_-8915469981148999515m_-2336174978307129080gmail_msg">  return otherAsyncFunction();</div><div class="m_-8915469981148999515m_-2336174978307129080gmail_msg">}</div><div class="m_-8915469981148999515m_-2336174978307129080gmail_msg"><br class="m_-8915469981148999515m_-2336174978307129080gmail_msg"></div><div class="m_-8915469981148999515m_-2336174978307129080gmail_msg">Even simpler, you'd just need co-routines.</div></div></div></div></div></div><span>
______________________________<wbr>_________________<br class="m_-8915469981148999515m_-2336174978307129080gmail_msg">
es-discuss mailing list<br class="m_-8915469981148999515m_-2336174978307129080gmail_msg">
<a href="mailto:es-discuss@mozilla.org" class="m_-8915469981148999515m_-2336174978307129080gmail_msg" target="_blank">es-discuss@mozilla.org</a><br class="m_-8915469981148999515m_-2336174978307129080gmail_msg">
<a href="https://mail.mozilla.org/listinfo/es-discuss" rel="noreferrer" class="m_-8915469981148999515m_-2336174978307129080gmail_msg" target="_blank">https://mail.mozilla.org/listi<wbr>nfo/es-discuss</a><br class="m_-8915469981148999515m_-2336174978307129080gmail_msg">
</span></blockquote></div></div>
</blockquote></div><br></div>
</div></div></blockquote></div><br></div>