Hi,
With Async programming you can mimic some order of processing, but it is not a given yet. You still have just 1 thread of execution, and all of the Async queues need to share that thread. In some "impure" environments like .NET which support multiple threads, sync, async, etc, users may try to come up with their own custom Async features by employing threads...
With Async programming we are delaying the execution of those queues. With just 1 queue, if you delay it, you may still be fairly sure that order would be maintained it the queue were executed. But with multiple, competing queues, the order would not necessarily match the one you had imagined. With Async programming we are moving some of the operating system's responsibility into our programs, all so that we get a somewhat safe shared memory with some concurrency.
Something that comes about a lot in Async programming is that the program may finish executing and the queues would still have data to be processed. In a command line tool that finishes executing in milliseconds, you may have to wait till those queues are cleared so that you don't lose data. But even in a server environment you have to be sure that when you want to restart the server that all of the queues are finished. The queues having to finish processing is like a program whose data hasn't been flushed yet.
With Sync programming, sometimes you can be sure that the data is "flushed" as soon as you issue the command. With Async programming, you are not so sure anymore.
I like Async programming as an ideal because it has shared memory! It is probably an OK tradeoff in a GUI application that works from the network. It is a kind of sandbox since you cannot spawn threads on your own. Its purpose then is mainly to download and upload data without blocking your UI. With Node.JS it started changing into also being useful on the server, so long as it does not block the thread for long or cause many bugs... If Async programming was just that, it could have likely been reduced to just a library used for transferring data. A GUI was already "async" by default because of the need to respond to events.
We can blame "Async" on Node.JS and Microsoft's .NET. :-)
Cheers,
Joao