considere este cenário para validar:
function validateForm (validCallback) {
$('#first-name').add($('#last-name')).add($('#address')).each(function () {
// validating fields and adding 'invalid' class to invalid fields.
});
// doing validation this way for almost 50 fields (loop over 50 fields)
if ($('#holder .invalid').length == 0) {
// submitting data here, only when all fields are validated.
}
}
Agora, meu problema é que, o bloco if é executado antes que os loops sejam concluídos. Eu esperava que o corpo validateForm
fosse executado de forma síncrona, mas parece que a each()
função jQuery é executada de forma assíncrona. Estou certo? Por que isso não funciona?
jquery
asynchronous
Saeed Neamati
fonte
fonte
each
é síncrono, mas o interior código pode não ser ...each
em si é processado de forma síncrona. Você está iniciando alguma operação assíncrona de dentro do loop?Respostas:
Sim, o
each
método jQuery é síncrono. Quase todo o JavaScript é síncrono. As únicas exceções são AJAX, timers (setTimeout
esetInterval
) e HTML5 Web Workers.Seu problema provavelmente está em outro lugar no seu código.
fonte
jQuery
é puramente uma biblioteca javascript. Excetoajax
,setTimeout
esetInterval
não há nada que possa ser executado de forma assíncronaJavaScript
. Entãoeach
é definitivamente executado de forma síncrona. Definitivamente, existe algum erro js dentro doeach
código de bloco. Você deve dar uma olhada no console quanto a erros.Como alternativa, você pode dar uma olhada na fila do jQuery para executar qualquer função na fila. Isso garantirá que a função na fila seja executada apenas quando a execução do código anterior for concluída.
fonte
Outro motivo para fazer essa pergunta seria que .each simplesmente interromperá a iteração quando a função (.each ()) retornar false, e uma variável adicional deve ser usada para passar as informações "return false".
fonte
Para mim, funciona como assíncrono. Se funciona sincronizado, por que funciona assim:
fonte
return false
A.each()
função in quebra apenas o loop, e o código restante fora do loop ainda é executado. Portanto, defina uma bandeira em.each()
loop e verifique-a fora do loop.fonte
Mesmo problema. Então eu corrijo assim
fonte
É assim que eu faço
fonte
Eu tive o mesmo problema. meu $ .each estava dentro da função de sucesso da chamada ajax. Eu fiz minha chamada ajax síncrona adicionando
async: false
e funcionou.fonte
O método jQuery.each faz um loop de forma síncrona, mas você não pode garantir que ele percorrerá os itens em qualquer ordem específica.
fonte