Callback spaghetti? Event driven programming requires lots of ugly callbacks with lots of state... or does it? Traditional solution to make a synchronous function func(args...) asynchronous is to change the prototype to func(args..., callback)