Знакомство с асинхронностью у JavaScript разработчиков обычно происходит на первых днях. Как правило это AJAX-запросы, таймеры и библиотечные функции, связанные с анимацией, например jQuery-методы fadeIn/fadeOut, slideUp/slideDown и так далее. В целом, это все не очень сложно, и разобраться с асинхронностью на этом этапе не представляет проблем.
Однако, как только разработчик переходит к написанию более или менее сложных приложений, в которых комбинируется все вышеуказанное, асинхронный поток может сильно затруднить понимание и поддержку кода. Цепочки асинхронных действий, например, анимация > ajax-запрос > анимация, создают достаточно сложную архитектуру, которая не подчиняется строгому направлению "снизу верх".
Попробую изложить свой опыт того, как я перестал бояться асинхронности.