<div dir="ltr"><div dir="ltr"><div class="gmail_default" style="font-family:arial,helvetica,sans-serif;color:rgb(0,0,0)">by the way, i think it can also be improved without the need of `async {}` blocks, just marking together the parallel awaits (`await||`) and write the code like in series, but grouping the parallel awaits when transpiling:</div><div class="gmail_default" style="font-family:arial,helvetica,sans-serif;color:rgb(0,0,0)"><br></div><div class="gmail_default" style="font-family:arial,helvetica,sans-serif;color:rgb(0,0,0)"><div style="font-family:Menlo,Monaco,"Courier New",monospace;font-size:12px;line-height:18px;white-space:pre"><div><span style="color:rgb(0,128,0)">// NOTE async {} = asynchronous scope (it groups parallel awaits => `await||`)</span></div><div><span style="color:rgb(0,128,0)">// NOTE p? = function call that returns a promise (? = just and index)</span></div><br><div><span style="color:rgb(0,0,255)">const</span> <span style="color:rgb(0,16,128)">x0</span> = <span style="color:rgb(175,0,219)">await</span> <span style="color:rgb(121,94,38)">p0</span>()</div><br><div><span style="color:rgb(0,0,255)">const</span> <span style="color:rgb(0,16,128)">x11</span> = <span style="color:rgb(121,94,38)">f11</span>() <span style="color:rgb(0,128,0)">// sync code in-the-middle</span></div><br><div><span style="color:rgb(0,0,255)">const</span> <span style="color:rgb(0,16,128)">x1</span> = <span style="color:rgb(175,0,219)">await</span> || <span style="color:rgb(121,94,38)">p1</span>(<span style="color:rgb(0,16,128)">x0</span>)</div><div><span style="color:rgb(0,0,255)">const</span> <span style="color:rgb(0,16,128)">x3</span> = <span style="color:rgb(175,0,219)">await</span> || <span style="color:rgb(121,94,38)">p3</span>(<span style="color:rgb(0,16,128)">x11</span>)</div><div><span style="color:rgb(0,0,255)">const</span> <span style="color:rgb(0,16,128)">x2</span> = <span style="color:rgb(175,0,219)">await</span> <span style="color:rgb(121,94,38)">p2</span>(<span style="color:rgb(0,16,128)">x1</span>)</div><div><span style="color:rgb(0,0,255)">const</span> <span style="color:rgb(0,16,128)">x10</span> = <span style="color:rgb(175,0,219)">await</span> <span style="color:rgb(121,94,38)">p10</span>(<span style="color:rgb(0,16,128)">x2</span>, <span style="color:rgb(0,16,128)">x3</span>)</div><br><div><span style="color:rgb(0,0,255)">const</span> <span style="color:rgb(0,16,128)">x4</span> = <span style="color:rgb(175,0,219)">await</span> || <span style="color:rgb(121,94,38)">p4</span>(<span style="color:rgb(0,16,128)">x1</span>, <span style="color:rgb(0,16,128)">x2</span>)</div><div><span style="color:rgb(0,0,255)">const</span> <span style="color:rgb(0,16,128)">x5</span> = <span style="color:rgb(175,0,219)">await</span> || <span style="color:rgb(121,94,38)">p5</span>(<span style="color:rgb(0,16,128)">x2</span>, <span style="color:rgb(0,16,128)">x3</span>)</div><div><span style="color:rgb(0,0,255)">const</span> <span style="color:rgb(0,16,128)">x6</span> = <span style="color:rgb(175,0,219)">await</span> <span style="color:rgb(121,94,38)">p6</span>(<span style="color:rgb(0,16,128)">x4</span>, <span style="color:rgb(0,16,128)">x5</span>, <span style="color:rgb(0,16,128)">x10</span>)</div><br><div><span style="color:rgb(0,0,255)">const</span> <span style="color:rgb(0,16,128)">x7</span> = <span style="color:rgb(175,0,219)">await</span> || <span style="color:rgb(121,94,38)">p7</span>(<span style="color:rgb(0,16,128)">x4</span>, <span style="color:rgb(0,16,128)">x6</span>)</div><div><span style="color:rgb(0,0,255)">const</span> <span style="color:rgb(0,16,128)">x9</span> = <span style="color:rgb(175,0,219)">await</span> || <span style="color:rgb(121,94,38)">p9</span>(<span style="color:rgb(0,16,128)">x5</span>, <span style="color:rgb(0,16,128)">x6</span>)</div><div><span style="color:rgb(0,0,255)">const</span> <span style="color:rgb(0,16,128)">x8</span> = <span style="color:rgb(175,0,219)">await</span> <span style="color:rgb(121,94,38)">p8</span>(<span style="color:rgb(0,16,128)">x6</span>, <span style="color:rgb(0,16,128)">x7</span>)</div><br><div><span style="color:rgb(175,0,219)">await</span> <span style="color:rgb(121,94,38)">p11</span>(<span style="color:rgb(0,16,128)">x8</span>, <span style="color:rgb(0,16,128)">x9</span>)</div><br><div><span style="color:rgb(0,128,0)">// it would resolve a tree of parallel and series like following with traditional promises</span></div><br><div><span style="color:rgb(0,16,128)">p0</span></div><div>    .<span style="color:rgb(121,94,38)">then</span>(<span style="color:rgb(0,16,128)">x0</span> <span style="color:rgb(0,0,255)">=></span> {</div><div>        <span style="color:rgb(0,0,255)">const</span> <span style="color:rgb(0,16,128)">x11</span> = <span style="color:rgb(121,94,38)">f11</span>()</div><br><div>        <span style="color:rgb(175,0,219)">return</span> <span style="color:rgb(38,127,153)">Promise</span>.<span style="color:rgb(121,94,38)">all</span>([<span style="color:rgb(121,94,38)">p1</span>(<span style="color:rgb(0,16,128)">x0</span>), <span style="color:rgb(121,94,38)">p3</span>(<span style="color:rgb(0,16,128)">x11</span>)])</div><div>            .<span style="color:rgb(121,94,38)">then</span>((<span style="color:rgb(0,16,128)">x1</span>, <span style="color:rgb(0,16,128)">x3</span>) <span style="color:rgb(0,0,255)">=></span></div><div>                <span style="color:rgb(121,94,38)">p2</span>(<span style="color:rgb(0,16,128)">x1</span>)</div><div>                    .<span style="color:rgb(121,94,38)">then</span>(<span style="color:rgb(0,16,128)">x2</span> <span style="color:rgb(0,0,255)">=></span></div><div>                        <span style="color:rgb(121,94,38)">p10</span>(<span style="color:rgb(0,16,128)">x2</span>, <span style="color:rgb(0,16,128)">x3</span>)</div><div>                            .<span style="color:rgb(121,94,38)">then</span>(<span style="color:rgb(0,16,128)">x10</span> <span style="color:rgb(0,0,255)">=></span></div><div>                                <span style="color:rgb(38,127,153)">Promise</span>.<span style="color:rgb(121,94,38)">all</span>([<span style="color:rgb(121,94,38)">p4</span>(<span style="color:rgb(0,16,128)">x1</span>, <span style="color:rgb(0,16,128)">x2</span>), <span style="color:rgb(121,94,38)">p5</span>(<span style="color:rgb(0,16,128)">x2</span>, <span style="color:rgb(0,16,128)">x3</span>)])</div><div>                                    .<span style="color:rgb(121,94,38)">then</span>((<span style="color:rgb(0,16,128)">x4</span>, <span style="color:rgb(0,16,128)">x5</span>) <span style="color:rgb(0,0,255)">=></span></div><div>                                        <span style="color:rgb(121,94,38)">p6</span>(<span style="color:rgb(0,16,128)">x4</span>, <span style="color:rgb(0,16,128)">x5</span>, <span style="color:rgb(0,16,128)">x10</span>)</div><div>                                            .<span style="color:rgb(121,94,38)">then</span>(<span style="color:rgb(0,16,128)">x6</span> <span style="color:rgb(0,0,255)">=></span> <span style="color:rgb(38,127,153)">Promise</span>.<span style="color:rgb(121,94,38)">all</span>([<span style="color:rgb(121,94,38)">p7</span>(<span style="color:rgb(0,16,128)">x4</span>, <span style="color:rgb(0,16,128)">x6</span>), <span style="color:rgb(121,94,38)">p9</span>(<span style="color:rgb(0,16,128)">x5</span>, <span style="color:rgb(0,16,128)">x6</span>)])</div><div>                                                .<span style="color:rgb(121,94,38)">then</span>((<span style="color:rgb(0,16,128)">x7</span>, <span style="color:rgb(0,16,128)">x9</span>) <span style="color:rgb(0,0,255)">=></span> <span style="color:rgb(121,94,38)">p8</span>(<span style="color:rgb(0,16,128)">x6</span>, <span style="color:rgb(0,16,128)">x7</span>)</div><div>                                                    .<span style="color:rgb(121,94,38)">then</span>(<span style="color:rgb(0,16,128)">x8</span> <span style="color:rgb(0,0,255)">=></span> <span style="color:rgb(121,94,38)">p11</span>(<span style="color:rgb(0,16,128)">x8</span>, <span style="color:rgb(0,16,128)">x9</span>))</div><div>                                                )</div><div>                                            )</div><div>                                    )</div><div>                            )</div><div>                    )</div><div>            )</div><div>    })</div><br><br></div></div></div></div><br><div class="gmail_quote"><div dir="ltr" class="gmail_attr">On Tue, Nov 26, 2019 at 12:21 PM manuelbarzi <<a href="mailto:manuelbarzi@gmail.com">manuelbarzi@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"><div class="gmail_default" style="font-family:arial,helvetica,sans-serif;color:rgb(0,0,0)">hi Tom<br></div><div class="gmail_quote"><div dir="ltr"><div dir="ltr"><div dir="ltr"><div dir="ltr"><div style="font-family:arial,helvetica,sans-serif;color:rgb(0,0,0)"><br></div></div><div class="gmail_quote"><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">So the parallel awaits would execute before the series awaits?</div></blockquote><div><br></div><div><div style="font-family:arial,helvetica,sans-serif;color:rgb(0,0,0)">not exactly. it would group the parallel awaits at the position the first parallel await|| is sentenced.</div><div style="font-family:arial,helvetica,sans-serif;color:rgb(0,0,0)"><br></div><div style="font-family:arial,helvetica,sans-serif;color:rgb(0,0,0)">following the demo i sent:</div><div style="font-family:arial,helvetica,sans-serif;color:rgb(0,0,0)"><br></div><div style="font-family:arial,helvetica,sans-serif;color:rgb(0,0,0)"><div style="font-family:Menlo,Monaco,"Courier New",monospace;font-size:12px;line-height:18px;white-space:pre-wrap"><div><span style="color:rgb(0,128,0)">// NOTE async {} = asynchronous scope (it groups parallel awaits => `await||`)</span></div><div><span style="color:rgb(0,128,0)">// NOTE p? = function call that returns a promise (? = just and index)</span></div><br><div><span style="color:rgb(0,16,128)">async</span> {</div><div>    <span style="color:rgb(0,0,255)">const</span> <span style="color:rgb(0,16,128)">x1</span> = <span style="color:rgb(175,0,219)">await</span> || <span style="color:rgb(121,94,38)">p1</span>()</div><div>    <span style="color:rgb(0,0,255)">const</span> <span style="color:rgb(0,16,128)">x2</span> = <span style="color:rgb(175,0,219)">await</span> <span style="color:rgb(121,94,38)">p2</span>(<span style="color:rgb(0,16,128)">x1</span>)</div><div>    <span style="color:rgb(0,0,255)">const</span> <span style="color:rgb(0,16,128)">x3</span> = <span style="color:rgb(175,0,219)">await</span> || <span style="color:rgb(121,94,38)">p3</span>()</div><div>    <span style="color:rgb(0,0,255)">const</span> <span style="color:rgb(0,16,128)">x10</span> = <span style="color:rgb(175,0,219)">await</span> <span style="color:rgb(121,94,38)">p10</span>(<span style="color:rgb(0,16,128)">x2</span>, <span style="color:rgb(0,16,128)">x3</span>)</div><br><div>    <span style="color:rgb(0,0,255)">let</span> <span style="color:rgb(0,16,128)">x4</span>, <span style="color:rgb(0,16,128)">x5</span>, <span style="color:rgb(0,16,128)">x6</span></div><br><div>    <span style="color:rgb(0,16,128)">async</span> {</div><div>        <span style="color:rgb(0,16,128)">x4</span> = <span style="color:rgb(175,0,219)">await</span> || <span style="color:rgb(121,94,38)">p4</span>(<span style="color:rgb(0,16,128)">x1</span>, <span style="color:rgb(0,16,128)">x2</span>)</div><div>        <span style="color:rgb(0,16,128)">x5</span> = <span style="color:rgb(175,0,219)">await</span> || <span style="color:rgb(121,94,38)">p5</span>(<span style="color:rgb(0,16,128)">x2</span>, <span style="color:rgb(0,16,128)">x3</span>)</div><div>        <span style="color:rgb(0,16,128)">x6</span> = <span style="color:rgb(175,0,219)">await</span> <span style="color:rgb(121,94,38)">p6</span>(<span style="color:rgb(0,16,128)">x4</span>, <span style="color:rgb(0,16,128)">x5</span>, <span style="color:rgb(0,16,128)">x10</span>)</div><div>    }</div><br><div>    <span style="color:rgb(0,0,255)">let</span> <span style="color:rgb(0,16,128)">x7</span>, <span style="color:rgb(0,16,128)">x8</span>, <span style="color:rgb(0,16,128)">x9</span></div><br><div>    <span style="color:rgb(0,16,128)">async</span> {</div><div>        <span style="color:rgb(0,16,128)">x7</span> = <span style="color:rgb(175,0,219)">await</span> || <span style="color:rgb(121,94,38)">p7</span>(<span style="color:rgb(0,16,128)">x4</span>, <span style="color:rgb(0,16,128)">x6</span>)</div><div>        <span style="color:rgb(0,16,128)">x8</span> = <span style="color:rgb(175,0,219)">await</span> <span style="color:rgb(121,94,38)">p8</span>(<span style="color:rgb(0,16,128)">x6</span>, <span style="color:rgb(0,16,128)">x7</span>)</div><div>        <span style="color:rgb(0,16,128)">x9</span> = <span style="color:rgb(175,0,219)">await</span> || <span style="color:rgb(121,94,38)">p9</span>(<span style="color:rgb(0,16,128)">x5</span>, <span style="color:rgb(0,16,128)">x6</span>)</div><div>    }</div><br><div>    <span style="color:rgb(175,0,219)">await</span> <span style="color:rgb(121,94,38)">p11</span>(<span style="color:rgb(0,16,128)">x8</span>, <span style="color:rgb(0,16,128)">x9</span>)</div><div>}</div></div></div><br></div><div style="font-family:arial,helvetica,sans-serif;color:rgb(0,0,0)">in the outer block, the first sentence is already parallel, ok, then all parallel awaits in this block will group at first position, siblings of this first one (that is p1 and p3).</div><div style="font-family:arial,helvetica,sans-serif;color:rgb(0,0,0)"><br></div><div style="font-family:arial,helvetica,sans-serif;color:rgb(0,0,0)">in the inner blocks too (just a casualty i created the demos this way, but could be different and still work). in the first inner block, p4 and p5, and in the second inner block, p7 and p9.</div><div style="font-family:arial,helvetica,sans-serif;color:rgb(0,0,0)"><br></div><div style="font-family:arial,helvetica,sans-serif;color:rgb(0,0,0)">"transpiling" it to promises, it would resolve a complex scenario like following (the demo could be improved, of course):</div><div style="font-family:arial,helvetica,sans-serif;color:rgb(0,0,0)"><br></div><div style="font-family:arial,helvetica,sans-serif;color:rgb(0,0,0)"> <span style="color:rgb(0,128,0);font-family:Menlo,Monaco,"Courier New",monospace;font-size:12px;white-space:pre-wrap">// it would resolve a tree of parallel and series like following with traditional promises</span></div><div style="color:rgb(0,0,0);font-family:Menlo,Monaco,"Courier New",monospace;font-size:12px;line-height:18px;white-space:pre-wrap"><br><div><span style="color:rgb(38,127,153)">Promise</span>.<span style="color:rgb(121,94,38)">all</span>([<span style="color:rgb(121,94,38)">p1</span>(), <span style="color:rgb(121,94,38)">p3</span>()])</div><div>    .<span style="color:rgb(121,94,38)">then</span>((<span style="color:rgb(0,16,128)">x1</span>, <span style="color:rgb(0,16,128)">x3</span>) <span style="color:rgb(0,0,255)">=></span></div><div>        <span style="color:rgb(121,94,38)">p2</span>(<span style="color:rgb(0,16,128)">x1</span>)</div><div>            .<span style="color:rgb(121,94,38)">then</span>(<span style="color:rgb(0,16,128)">x2</span> <span style="color:rgb(0,0,255)">=></span></div><div>                <span style="color:rgb(121,94,38)">p10</span>(<span style="color:rgb(0,16,128)">x2</span>, <span style="color:rgb(0,16,128)">x3</span>)</div><div>                    .<span style="color:rgb(121,94,38)">then</span>(<span style="color:rgb(0,16,128)">x10</span> <span style="color:rgb(0,0,255)">=></span> {</div><div>                        <span style="color:rgb(0,0,255)">let</span> <span style="color:rgb(0,16,128)">x4</span>, <span style="color:rgb(0,16,128)">x5</span>, <span style="color:rgb(0,16,128)">x6</span></div><br><div>                        <span style="color:rgb(175,0,219)">return</span> <span style="color:rgb(38,127,153)">Promise</span>.<span style="color:rgb(121,94,38)">all</span>([<span style="color:rgb(121,94,38)">p4</span>(<span style="color:rgb(0,16,128)">x1</span>, <span style="color:rgb(0,16,128)">x2</span>), <span style="color:rgb(121,94,38)">p5</span>(<span style="color:rgb(0,16,128)">x2</span>, <span style="color:rgb(0,16,128)">x3</span>)])</div><div>                            .<span style="color:rgb(121,94,38)">then</span>(<span style="color:rgb(0,16,128)">results</span> <span style="color:rgb(0,0,255)">=></span> [<span style="color:rgb(0,16,128)">x4</span>, <span style="color:rgb(0,16,128)">x5</span>] = <span style="color:rgb(0,16,128)">results</span>)</div><div>                            .<span style="color:rgb(121,94,38)">then</span>(() <span style="color:rgb(0,0,255)">=></span> <span style="color:rgb(121,94,38)">p6</span>(<span style="color:rgb(0,16,128)">x4</span>, <span style="color:rgb(0,16,128)">x5</span>, <span style="color:rgb(0,16,128)">x10</span>))</div><div>                            .<span style="color:rgb(121,94,38)">then</span>(<span style="color:rgb(0,16,128)">_x6</span> <span style="color:rgb(0,0,255)">=></span> <span style="color:rgb(0,16,128)">x6</span> = <span style="color:rgb(0,16,128)">_x6</span>)</div><div>                            .<span style="color:rgb(121,94,38)">then</span>(() <span style="color:rgb(0,0,255)">=></span> {</div><div>                                <span style="color:rgb(0,0,255)">let</span> <span style="color:rgb(0,16,128)">x7</span>, <span style="color:rgb(0,16,128)">x8</span>, <span style="color:rgb(0,16,128)">x9</span></div><div>        </div><div>                                <span style="color:rgb(175,0,219)">return</span> <span style="color:rgb(38,127,153)">Promise</span>.<span style="color:rgb(121,94,38)">all</span>([<span style="color:rgb(121,94,38)">p7</span>(<span style="color:rgb(0,16,128)">x4</span>, <span style="color:rgb(0,16,128)">x6</span>), <span style="color:rgb(121,94,38)">p9</span>(<span style="color:rgb(0,16,128)">x5</span>, <span style="color:rgb(0,16,128)">x6</span>)])</div><div>                                    .<span style="color:rgb(121,94,38)">then</span>(<span style="color:rgb(0,16,128)">results</span> <span style="color:rgb(0,0,255)">=></span> [<span style="color:rgb(0,16,128)">x7</span>, <span style="color:rgb(0,16,128)">x9</span>] = <span style="color:rgb(0,16,128)">results</span>)</div><div>                                    .<span style="color:rgb(121,94,38)">then</span>(() <span style="color:rgb(0,0,255)">=></span> <span style="color:rgb(121,94,38)">p8</span>(<span style="color:rgb(0,16,128)">x6</span>, <span style="color:rgb(0,16,128)">x7</span>))</div><div>                                    .<span style="color:rgb(121,94,38)">then</span>(<span style="color:rgb(0,16,128)">_x8</span> <span style="color:rgb(0,0,255)">=></span> <span style="color:rgb(0,16,128)">x8</span> = <span style="color:rgb(0,16,128)">_x8</span>)</div><div>                                    .<span style="color:rgb(121,94,38)">then</span>(() <span style="color:rgb(0,0,255)">=></span> <span style="color:rgb(121,94,38)">p11</span>(<span style="color:rgb(0,16,128)">x8</span>, <span style="color:rgb(0,16,128)">x9</span>))</div><div>                            })</div><div>                    })</div><div>            )</div><div>    )</div></div><div><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"> What if there are series awaits before the first parallel await? </div></blockquote><div><br></div><div><div style="font-family:arial,helvetica,sans-serif;color:rgb(0,0,0)">no problem, if there was one before, then in it would be chained first in the outer promise, and following it would be the promise.all for the next parallel group.</div></div><div> </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">What if the parallel awaits depend on the results of those series awaits? It reads very strangely.</div></blockquote><div><br></div><div style="font-family:arial,helvetica,sans-serif;color:rgb(0,0,0)">that's totally valid as far as the parallel await is located after the series awaits.</div></div></div></div></div>
</div></div>
</blockquote></div>