I’m all for the `async` block. In Scala, there actually are no `async` 
functions; only `async` blocks. (Technically, this isn’t in the language; it’s 
a macro from a library called scala-async <https://github.com/scala/async>.) 
This works out a bit more nicely because it’s expression-oriented to begin with.

But the nice thing about `async` blocks is that you can then use promise 
combinators within a function that might compose a couple different `async` 
operations. This might be a little less necessary in Javascript though, since 
it is rather flexible on the typing of promise-related functions; it will 
promote values to promises where necessary and flatten nested promises. Often 
in Scala, I’ll wrap a normal value in an `async` to make it a `Future` (Scala’s 
`Promise`).

> On Jan 3, 2017, at 10:48, Jeremy Martin <[email protected]> wrote:
> 
> That would create a refactoring hazard if i had the block: `{ a(); b(); 
> return c(); }` and stuck the `async` keyword in front of it [...]
> 
> That's a pretty specific keyword to slip in before a given code block - is 
> that really much of a real-world risk?
> 
> Also worth noting that the grammar here would have to preclude newlines 
> between `async` and the opening bracket. This is already perfectly valid 
> JavaScript:
> 
> var async = 'gotcha'
> 
> var promise = async
> 
> { console.log('hi!') }
> 
> That being said, this probably doesn't really make sense on it's own, but 
> could definitely build on top of do/let blocks or lamdas (<-- not really 
> current with the state of affairs on any of that).
> 
> 
> On Tue, Jan 3, 2017 at 10:16 AM, Jordan Harband <[email protected] 
> <mailto:[email protected]>> wrote:
> That would create a refactoring hazard if i had the block: `{ a(); b(); 
> return c(); }` and stuck the `async` keyword in front of it - suddenly the 
> function wouldn't have an early completion in the block, it'd create and 
> throw away a Promise.
> 
> On Tue, Jan 3, 2017 at 12:52 AM, Igor Baklan <[email protected] 
> <mailto:[email protected]>> wrote:
> I looks like it would be nice to have ``async``-block which might be alias to 
> ``async``-lambda immediate invocation, so that:
> 
> ```js
> var promise = async { /*some statements with await*/ };
> ```
> <==>
> 
> ```js
> var promise = (async () => { /*some statements with await*/ }) ();
> ```
> 
> and
> 
> ```js
> var promise = async ( /*some statements with await*/ );
> ```
> <==>
> 
> ```js
> var promise = (async () => ( /*some expression with await*/ )) ();
> ```
> 
> Then it can gave some convenience in writing some semi-async function, like 
> for example parallel async batch processing, which might look like:
> 
> ```js
> const backupBatch = (batch) => {
>   var tasks = [];
>   for (let item of batch) {
>     tasks.push(
>       async {
>         const content = await readContent(item);
>         await writeContent(item + ".bak", content);
>       }
>     )
>   }
>   return Promise.all(tasks)
> }
> ```
> 
> or like
> 
> ```js
> const backupBatch = (batch) => {
>   var tasks = [];
>   for (let item of batch) {
>     tasks.push(
>       async (
>         await writeContent(item + ".bak", await readContent(item));
>       )
>     )
>   }
>   return Promise.all(tasks)
> }
> ```
> 
> of course this simplistic case can be rewritten without ``async``-block like:
> 
> ```js
> const backupBatch = (batch) => {
>   return Promise.all(
>     batch.map(
>       async (item) => (
>         await writeContent(item + ".bak", await readContent(item));
>       )
>     )
>   );
> }
> ```
> However I believe this not reduce usefulness of initial ``async``-block 
> construction.
> 
> Also it should be mentioned that this idea "is't new", something very similar 
> I saw in [[async-do]](/topic/support-syntax#content-5) comment.
> 
> And finally, if this construct will  be introduced, it will provide some nice 
> symmetry - of whether you put async keyword in function header definition, or 
> at the very beginning of its body, like:
> 
> ```js
> const asyncFunc = async (/*args*/) => {/*function body with await-s*/};
> ``` 
> <==>
> ```js
> const asyncFunc = (/*args*/) => { return async {/*function body with 
> await-s*/} };
> ``` 
> <==>
> ```js
> const asyncFunc = (/*args*/) => ( async {/*function body with await-s*/} );
> ``` 
> 
> And
> ```js
> const asyncFunc = async (args) => (some_async_expression);
> ``` 
> <==>
> ```js
> const asyncFunc = (args) => async (some_async_expression);
> ``` 
> 
> By the way parentheses here is essential, since ``async x => x`` != ``async 
> (x => x)``, cause first evaluates into async-function, while the second 
> should be evaluated into completed promise which value is ``sync`` function 
> ``(x => x)``.
> 
> 
> _______________________________________________
> es-discuss mailing list
> [email protected] <mailto:[email protected]>
> https://mail.mozilla.org/listinfo/es-discuss 
> <https://mail.mozilla.org/listinfo/es-discuss>
> 
> 
> 
> _______________________________________________
> es-discuss mailing list
> [email protected] <mailto:[email protected]>
> https://mail.mozilla.org/listinfo/es-discuss 
> <https://mail.mozilla.org/listinfo/es-discuss>
> 
> 
> 
> 
> -- 
> Jeremy Martin
> 661.312.3853
> http://devsmash.com <http://devsmash.com/>
> @jmar777
> _______________________________________________
> es-discuss mailing list
> [email protected]
> https://mail.mozilla.org/listinfo/es-discuss

_______________________________________________
es-discuss mailing list
[email protected]
https://mail.mozilla.org/listinfo/es-discuss

Reply via email to