Promises, the Long Way
For whatever reason, working from throws → functors → monads → Result → Promise in the context of async error handling really made the whole concept click for me. YMMV, but I really value these ground-up pattern exposés Olivier Halligon does.