<div dir="ltr"><div>Typically I find I want to loop over an iterator of items and apply a function body of work on them in parallel.</div><div><br></div><div>So it would be nice to support full blocks of statements that can do this work in parallel, instead of relying on just expressions or functions to achieve this.<br></div><div><br></div><div>Extending for loops to have a parallel form is another option (I seem to recall something similar brought up before here):<br></div><div><br></div><div>```<br></div><div>for await.all (const entry of entries) {</div><div>  await doWork(entry);<br></div><div>}<br></div><div>```</div><div><br></div><div>Whether async iteration should be supported or treated as sync or parallel is another question though, and possibly a confusion of the form.</div></div><br><div class="gmail_quote"><div dir="ltr" class="gmail_attr">On Tue, 19 Nov 2019 at 23:20, Jordan Harband <<a href="mailto:ljharb@gmail.com">ljharb@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">If we have `await.all`, what about `await.race`, `await.allSettled`, `await.any`?</div><br><div class="gmail_quote"><div dir="ltr" class="gmail_attr">On Tue, Nov 19, 2019 at 7:45 PM Jacob Bloom <<a href="mailto:mr.jacob.bloom@gmail.com" target="_blank">mr.jacob.bloom@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">To simplify the problem of working with promises in parallel, I<br>
propose this new syntax:<br>
<br>
```javascript<br>
async function initialize() {<br>
  let foo, bar, baz;<br>
  await.all {<br>
    foo = (await request('foo.json')).data;<br>
    bar = (await request('bar.json')).data;<br>
    baz = (await request('baz.json')).data;<br>
  }<br>
  render(foo, bar, baz);<br>
}<br>
```<br>
<br>
Each child statement of the curly braces is evaluated in parallel and<br>
execution resumes when they've all resolved.<br>
<br>
**The Problem:** with current syntax, the above function would<br>
probably look something like this:<br>
<br>
```javascript<br>
async function initialize() {<br>
  const [<br>
    { data: foo }, // renaming response.data => foo<br>
    { data: bar },<br>
    { data: baz },<br>
  ] = await Promise.all([<br>
    request('foo.json'),<br>
    request('bar.json'),<br>
    request('baz.json'),<br>
  ]);<br>
  render(foo, bar, baz);<br>
}<br>
```<br>
<br>
For this kind of use case, `Promise.all` leads to "parallel lists" of<br>
promises and their return values, which must be kept in sync. Using<br>
those values either requires (sometimes deep) destructuring or<br>
temporary variables.<br>
<br>
This structure is also just fundamentally different from working<br>
serially in async/await and it forces you to reason about the problem<br>
in a specific way. This doesn't appear to be a conscious decision to<br>
force good code practices, it's just a limitation that falls naturally<br>
out of the current syntax. Thus, we have an opportunity to shift some<br>
of the burden back to the language with this new syntax.<br>
<br>
Here's the full proposal:<br>
<a href="https://github.com/mrjacobbloom/proposal-await-all" rel="noreferrer" target="_blank">https://github.com/mrjacobbloom/proposal-await-all</a> -- let me know what<br>
you think!<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>
</blockquote></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>