Синхронность применяйте когда результат операции получается
сразу. JavaScript выполняется в один поток, поэтому пока что-то синхронное происходит, всё остальное ждёт в сторонке. В том числе события интерфейса.
Асинхронность используйте везде, где нужно
ждать. Чтобы не ждать:
- Отправили запрос на сервер. Ответ будет неизвестно, когда – то ли сеть медленная, то ли сервер призадумается. В это время JS может заняться чем-то ещё. Дайте ему такую возможность.
- События интерфейса - неизвестно, когда нажмут на кнопку или введут значение в форму. Даже длинная цепочка действий: отправили пользователя авторизоваться через третий сайт.
- Длинные сложные вычисления. Их можно вынести в web worker, отправлять в него задачу и асинхронно ждать результата. В это время бодро реагировать на кнопки и прочее.
p.s. Ждать, не важно, сколько: всего несколько миллисекунд или полчаса.
p.p.s. для желающих упороться подробностями:
Concurrency model and Event Loop