When a normal function is executed, it runs sequentially . That is, if you have two functions A () and B () and execute them in that order, the B () function will only be called when the A () function finishes its execution.
By contrast, if you have an asynchronous function A () (for example, that performs an I / O operation or other blocking operation), it can be called and while the operation is performed you can execute another function B () ( asynchronous or not) in the main context. Later, the A () function will return its value when the operation is finished and the main thread is available for that.
Warning that synchronous / asynchronous does not have to do with multi-threading.