In my opinion, you can't avoid callback hell. It's the nature of async programing. You should take advantage of async programing, not trying to make it looks like synchronous.
You must use callback to create a promise, just to achieve the "then" syntax. The "then" syntax looks better, but not really provide anything useful than callback, why bother. The only useful feature of promise is Promise.all
, which you can use to wait for all your promises finish.
Try using rxjs for handling async problems. You still have to use callback to create a rxjs observable. But rxjs provides lots of functionality to help you take advantage of async programing, not avoid it.