var a = something_async(), b = something_else_async();
Upon calling something_async, the code starts waiting and blocks further execution until it is ready, going to the next statement. This is not a foreign concept at all, and is used in javascript as well with alert, prompt, confirm:
fries = window.confirm("Do you want fries with that?")
confirm is an async method (has to wait for the user), but the next line is not executed until it returns. I personally see no advantage to creating a system of callbacks:
do_x(function () { do_y(function() { do_z() }) })
when this would be much more readable:
do_x(); do_y(); do_z();
and would have the exact same perf characteristics. In fact, you could probably simpy code transform the latter into the former (I know this is what stratified JS does), although this is probably the worst way to do it. What you really want is to just auto-call "wait" on every promise (I believe wait still gives you the asynchronous benefits).
Of course, the main "drawback" to this is that you need language support to pull it off, so you need to implement a preprocessor of some sort.