As far as I can tell, that is the definition of synchronous. If you have a bunch of asynchronous calls inside a function, that means that after each asynchronous call any subsequent js can continue executing. Therefore, when the last asynchronous call is made, the init() function will finish executing. As a hack, you could add a synchronous call at the end that is guaranteed to take a long time to stall the init() function, but I wouldn't recommend that. Or, you could try adding a function call at the end of init() that polls the readyState of each of the xhr calls inside an infinite while loop, and then when all the readyState's == 4, you can break out of the while loop.
Once the different labels have been created the init function can be completed.