coffee-script
coffee-script copied to clipboard
Optionally include defer arguments after await
Just throwing up an idea. This is completely half baked. How about supporting the following syntax...
on (err) return error(err)
await (err, data) = http.post(data, url, defer)
await (err, data) as result and (bla) as special = db.get(key, result, special)
await (err, data) as result or (bla) as special = db.get(key, result, special)
- Allowing the callback paramers to be placed immediatley after
awaitis more readable imho. - Use of the
askeyword to manage when one function accepts two callbacks - The
onkeyword would record an expression to be evaluated just before any await callback is fired.
I think there would be a couple issues here. Most notably that there's a disconnect between the await wrapper and the number of defers. You can do pretty funky things:
await
foo defer(err1, res1)
foo defer(err2, res2)
if bar?
foo defer(err3, res3)
some_process_queue_class_i_wrote.add defer()
I feel this is pretty readable but some front-loaded system of these conditional defers would be pretty hard to write.
If I understand it correctly, your syntax change works only on awaits that have single defers inside them. (Or am I misreading?)
The error handling is interesting, although I don't think a "return" would be possible because whatever function you're talking about is an async function, and this is happening after awaited callbacks. A very similar and awesome solution is max's "error short circuiter" class, which is super simple and powerful:
http://maxtaco.github.io/programming/2014/09/18/handling-errors-in-iced-coffee-script/
# this handles the error for you and short-circuits your cb with the error if there is one:
await http.post data, url, esc defer data
I'm thinking more of sequential scenarios, but I'd imagine your example might become...
await
(err1, result1) = foo defer
(err2, result2) = foo defer
if bar? then (err3, result3) = foo defer
some_process_queue_class_i_wrote.add defer
or, with splats indicating that a callback argument should be pushed to an array of the given name, ...
await
(errors..., result1) = foo defer
(errors..., result2) = foo defer
if bar? then (err3, result3) = foo defer
if errors.length then error("An error occured")
else some_process_queue_class_i_wrote.add defer
or, maybe
on errors then error("An error occured", errors)
await (errors..., results...) as resultCollector
foo resultCollector
foo resultCollector
if bar? foo resultCollector
if !errors then await (finalAnswer) = some_process_queue_class_i_wrote.add results, defer
I like the first one the best. Note that I'm assuming a change so that defer can be used as a keyword/statement instead of as a faux function.