Este es un caso complicado, puesto que tienes más de una promesa y por tanto debes esperar a que se resuelvan todas para decidir si envías o no el formulario. Esto se hace con Promise.all:
Código Javascript
:
Ver original$(document).ready(function() {
const f2 = $('#f2');
f2.on('submit', event => {
event.preventDefault(); // por defecto, cancelamos el envio del formulario
let errorCount = 0, // iniciamos el contador de errores
requestPromiseArray = [];
f2.find('.concepto').each(function(i, elem) {
elem.className = 'concepto pending';
let conceptos = elem.value,
requestPromise = $.post("procesa-gastosprivado.php", {
conceptos
}).then(function(mensaje) {
errorCount += (mensaje == 'error') ? 1 : 0;
elem.classList.remove('pending');
elem.classList.add(mensaje);
});
requestPromiseArray.push(requestPromise);
});
Promise.all(requestPromiseArray).then(function(){ // cuando todas las promesas se hayan resuelto
if(errorCount == 0) // si no hay ningun error, enviamos el formulario
$('#f2').get(0).submit();
});
});
});
Nota: la implementación de jQuery del método submit() dispara los handlers del evento "submit". En cambio, la implementación nativa del método submit NO dispara los handlers del evento submit. Como queremos que no se disparen los handlers del evento submit, debemos utilizar
$('#f2').get(0).submit()
, de esta forma operamos con el método submit nativo.