Перед выполнением какого-либо действия, мне необходимо проверить баланс клиента с помощью функции getBalance().
Суть в том, что getBalance внутри выполняет mysql запрос и возвращает баланс, и как вы уже, вероятно, догадались, getBalance не успевает завершить выполнение, как следующий код блока продолжает свою работу с пустой переменной, которая должна быть заполнена балансом клиента.
Валентин Дубровский: человек спросил КАК, я ему дал самый простой ответ)
По поводу промисов и async - да, это избавляет от того что вы называете callback-hell. От него так же спасает отказ от того стиля что я применил в ответе (определение callback-а прямиком в параметре функции). Спасибо за дополнение к ответу!