En jQuery, es posible invocar una devolución de llamada o activar un evento después de una invocación de .each()
(o cualquier otro tipo de devolución de llamada iterativo) ha completado .
Por ejemplo, me gustaría completar este "fundido y eliminación"
$(parentSelect).nextAll().fadeOut(200, function() {
$(this).remove();
});
antes de hacer algunos cálculos e insertar nuevos elementos después de $(parentSelect)
. Mis cálculos son incorrectos si los elementos existentes aún son visibles para jQuery y dormir / retrasar una cantidad arbitraria de tiempo (200 para cada elemento) parece, en el mejor de los casos, una solución frágil.
Puedo fácilmente .bind()
la lógica necesaria para una devolución de llamada de evento, pero no estoy seguro de cómo invocar limpiamente .trigger()
después de que se haya completado la iteración anterior . Obviamente, no puedo invocar el disparador dentro de la iteración, ya que se dispararía varias veces.
En el caso de $.each()
, he considerado agregar algo al final del argumento de datos (que buscaría manualmente en el cuerpo de la iteración) pero odiaría que me obligaran a hacerlo, así que esperaba que hubiera algún otro elegante forma de controlar el flujo con respecto a las devoluciones de llamada iterativas.
Respuestas:
Una alternativa a la respuesta de @ tv:
Tenga en cuenta que
.each()
sí mismo es sincrónico : la instrucción que sigue a la llamada a.each()
se ejecutará solo después de que.each()
se complete la llamada. Sin embargo, las operaciones asincrónicas iniciadas en la.each()
iteración, por supuesto, continuarán a su manera. Ese es el problema aquí: las llamadas para desvanecer los elementos son animaciones controladas por temporizador, y continúan a su propio ritmo.La solución anterior, por lo tanto, realiza un seguimiento de cuántos elementos se desvanecen. Cada llamada a
.fadeOut()
recibe una devolución de llamada de finalización. Cuando la devolución de llamada se da cuenta de que se cuenta a través de todos los elementos originales involucrados, se pueden tomar medidas posteriores con la confianza de que todo el desvanecimiento ha finalizado.Esta es una respuesta de cuatro años (en este momento en 2014). Una forma moderna de hacer esto probablemente implicaría usar el mecanismo de Diferido / Promesa, aunque lo anterior es simple y debería funcionar bien.
fuente
Probablemente sea demasiado tarde, pero creo que este código funciona ...
fuente
Ok, esto podría ser un poco después del hecho, pero .promise () también debería lograr lo que buscas.
Documentación de la promesa
Un ejemplo de un proyecto en el que estoy trabajando:
:)
fuente
JavaScript se ejecuta sincrónicamente, por lo que lo que coloque después
each()
no se ejecutará hasta queeach()
se complete.Considere la siguiente prueba:
Cuando se llama a la alerta, el recuento será igual a 1000000 porque la alerta no se ejecutará hasta
each()
que finalice.fuente
each
y programa cada animación por separado, aún tiene que disparar el evento después de la animación, no cada uno termina.each()
problema. Es por eso que arrojé esta respuesta a la mezcla.each
no se garantizaban antesalert
. ¿Podría explicarme o señalarme la lectura de esto?Encontré muchas respuestas relacionadas con matrices pero no con un objeto json. Mi solución fue simplemente iterar a través del objeto una vez mientras incrementaba un contador y luego, al iterar a través del objeto para ejecutar su código, puede incrementar un segundo contador. Luego, simplemente compara los dos contadores y obtén tu solución. Sé que es un poco torpe, pero hasta ahora no he encontrado una solución más elegante. Este es mi código de ejemplo:
Como dije, no es el más elegante, pero funciona y funciona bien y todavía no he encontrado una solución mejor.
Saludos, JP
fuente
Si está dispuesto a dar un par de pasos, esto podría funcionar. Sin embargo, depende de que las animaciones terminen en orden. No creo que eso deba ser un problema.
fuente
qué pasa
fuente
Debe poner en cola el resto de su solicitud para que funcione.
fuente
Me encuentro con el mismo problema y lo resolví con una solución como el siguiente código:
La solución resuelve el siguiente problema: sincronizar las operaciones asincrónicas iniciadas en la iteración .each (), utilizando el objeto diferido.
fuente
Tal vez una respuesta tardía, pero hay un paquete para manejar esto https://github.com/ACFBentveld/Await
fuente
Estoy usando algo como esto:
fuente