Пошарился немного в инете и нашел решение, оставлю на своем примере, может быть кому-то пригодится. При успешном событии кнопка блокируется, повторный запрос не отправляется. При ошибке убираем атрибут disable, чтобы человек мог отредактировать строки и отправить заново.
$('#appExchange').submit(function(e){
e.preventDefault();
$("#appExchange [type=submit]").prop('disabled', true);
var url = '/ajax.php?action=app&type=exchange';
var balance_user = $('#balance_user').html();
var balance_adver = $('#balance_adver').html();
var data = $(this).serialize()+'&balance_user='+balance_user+'+&balance_adver='+balance_adver+'&ajax=1';
$.post(url, data, function(result){
Toast.fire({icon: result['status'],text: result['text']});
if(result['status'] == 'error'){
$("#appExchange [type=submit]").prop('disabled', false);
}
if(result['status'] == 'success'){
$('#balance_user').html(result['balance_user'].toFixed(5));
$('#balance_adver').html(result['balance_adver'].toFixed(5));
}
}, 'json');
return false;
});