<div id="__MailbirdStyleContent" style="font-size: 10pt;font-family: arial;color: #000000">
                                        
                                        
                                            
                                        
                                        
                                        Thank-you guys for the excellent problems with the previous idea, to attempt to fix as many of them as I can, here is an alteration to the proposal:<div class="mb_sig"></div>
                                        
                                        <div><br></div><div>You have two types of functions, asynchronous and synchronous functions.  To distinguish between them, an asynchronous function has the keyword of `async` prepended before it.  Also, unlike the `return` statement in a synchronous function, the asynchronous code has `async return`.  Examples:</div><div>
  
  


<h2></h2>

<div class="highlight" style="background: #f8f8f8"><pre style="line-height: 125%"><span style="color: #008000; font-weight: bold">function</span> someSync() {
        <span style="color: #008000; font-weight: bold">return</span> <span style="color: #BA2121">"Sync"</span>;
}

async <span style="color: #008000; font-weight: bold">function</span> someAsync() {
        setTimeout(() <span style="color: #666666">=></span> {
                async <span style="color: #008000; font-weight: bold">return</span> <span style="color: #BA2121">"Async"</span>;
        }, <span style="color: #666666">1000</span>);
}
</pre></div></div><div>The synchronous code is called as one would expect, however the asynchronous code can be called in two ways:</div><div>
  
  


<h2></h2>

<div class="highlight" style="background: #f8f8f8"><pre style="line-height: 125%"><span style="color: #008000; font-weight: bold">function</span> calleeOne() {
        <span style="color: #008000; font-weight: bold">let</span> x <span style="color: #666666">=</span> await someAsync();
}

<span style="color: #008000; font-weight: bold">function</span> calleeTwo() {
        <span style="color: #008000; font-weight: bold">let</span> x <span style="color: #666666">=</span> someAsync();
}
</pre></div></div><div>You'll notice the main difference between this latest iteration and the first proposal <i>is that you do not need to put `async` around your callee function</i>.  In the first case, the code waits until `x` has a value, here the value will be "Async" after one second.  In the second case, the code continues on instantly, with `x` being an automatically wrapped promise.  This has many advantages, including the most obvious example given by Florian:</div><div>
  
  


<h2></h2>

<div class="highlight" style="background: #f8f8f8"><pre style="line-height: 125%"><span style="color: #408080; font-style: italic">// Assumes a function `someAsync()` which is an asychronous function.</span>
<span style="color: #008000; font-weight: bold">function</span> c() {
        <span style="color: #008000; font-weight: bold">return</span> d()
}
<span style="color: #008000; font-weight: bold">function</span> d() {
        <span style="color: #008000; font-weight: bold">return</span> await someAsync()
}
</pre></div></div><div>You'll notice we've simply made `someAsync()` as a function, synchronous.  No code changes are needed above the `c()` function, unlike in the previous proposal iteration.</div><div><br></div><div>I'll be interested to see what you guys consider the advantages/disadvantages of this method, which I hope to be "the middle between two ends" on whether to go fully into promises or fully into co-routines.  Neither of which are in my opinion the optimal stance.</div><blockquote class="history_container" type="cite" style="border-left-style: solid;border-width: 1px;margin-top: 20px;margin-left: 0px;padding-left: 10px;min-width: 500px">
                        <p style="color: #AAAAAA; margin-top: 10px;">On 26/02/2017 14:31:30, Florian Bösch <pyalot@gmail.com> wrote:</p><div dir="ltr">await/async are de-facto co-routines. await/async will infect all code by necessity of software engineering. At which point they're actual co-routines, implemented badly, without a proper API.</div><div class="gmail_extra"><br><div class="gmail_quote">On Sun, Feb 26, 2017 at 3:26 PM, Jerald Cohen <span dir="ltr"><<a href="mailto:cohenjerald7@gmail.com" target="_blank">cohenjerald7@gmail.com</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin: 0 0 0 .8ex;border-left: 1px #ccc solid;padding-left: 1ex;min-width: 500px"><div dir="ltr"><div><span style="font-size: 12.8px;white-space: nowrap">Florian,</span></div><div><br></div><div>You sure you're not just adding more complexities to a language with features that were _meant_ to remove such complexity?<br></div><div><br></div><div>Codefined's solution to me seems to be the one with the least amount of added techniques in order to learn.  Although I understand how co-rountines are awesome, they can quickly get very confusing when you switch contexts.</div></div>
</blockquote></div><br></div>

                        </blockquote></div>