<button id="promo_button" disabled>Кнопка</button>
....
//Проверяем локальный кэш на сайте, и обращаемся к БД в случае его остуствия
if (!localStorage.promo_code) {
Check_BD_Promise = new Promise( ......... );
else if (localStorage.promo_status == "in database") {
document.getElementById("promo_button").disabled = false;
}
.....
//Запоминаем ответ БД
Check_BD_Promise.then((code, status)=> //после обращения к БД
localStorage.promo_code = code; //"XYZ";
localStorage.promo_status = status; //"in database"; //для примера
);
.....
//При нажатии на кнопку тоже что-то делаем в соответствии с бизнес-логикой
document.getElementById("promo_button").addEventListener("click", ()=>{
......... //отправка запроса на изменение бд
if (localStorage.promo_code) {
localStorage.promo_status = "already not in database";
}
});
...но на практике, столкнуться с такой уязвимостью равно шансу выиграть в очень большую лотерею, и чем чаще обновляется система и браузер, тем меньше этот шанс.
А вообще, чтобы реально докопаться до причины, нужно смотреть подробности ошибки, то есть логи. Если нужные логи отключены - включить их, и снова дождаться ошибки.
Однако есть такое понятие, как плавающий баг. Условия возникновения бага могут быть сложными в том смысле, что их очень сложно понять. Например, баг может возникать только если запущено какое-то другое приложение и ОС настроена определённым образом, или в определённое время суток и т.д. Для таких багов код ошибки мало чем сможет помочь. Такой баг даже разработчик будет искать долго, располагая всей отладочной информацией.
Для сырых приложений и операционных систем - в порядке вещей иметь редкие или плавающие баги после дымового тестирования, и таких багов много. Для их выявления продукт выходит в бету. Первые пользователи являются бета-тестерами, причём им никто за это не платит. Вот вы как раз и являетесь подобным бесплатным бета-тестером (хуже быть только альфа-тестером, когда продукт не вышел в бета-релиз).