Tengo el siguiente código JavaScript:
$('a.button').click(function(){
if (condition == 'true'){
function1(someVariable);
function2(someOtherVariable);
}
else {
doThis(someVariable);
}
});
¿Cómo puedo asegurarme de que function2
se llame solo después de que se function1
haya completado?
javascript
jquery
Rrryyyaaannn
fuente
fuente
function1
realizando una operación asincrónica?Respuestas:
Especifique una devolución de llamada anónima y haga que function1 lo acepte:
fuente
...do stuff
contiene cosas que son asíncronas? La función 2 todavía no se activará cuando se espera. El ejemplo en mi comentario anterior muestra que debido a que lafoo()
función tiene código asincrónico,bar()
no dispara su contenido despuésfoo()
de que el contenido se haya ejecutado, incluso usando$.when().then()
para llamarlos uno tras otro. Esta respuesta solo es válida si (y solo si) todas las cosas...do stuff
en su código son estrictamente sincrónicas.callBack()
después de todos n asíncronos llamadas se realizan. Dado que OP no ha mencionado lo que está haciendo en la función, lo asumió como una llamada asincrónica de un nivel.Si está utilizando jQuery 1.5, puede utilizar el nuevo patrón de diferidos:
Editar: Enlace actualizado del blog:
Rebecca Murphy tuvo una gran reseña sobre esto aquí: http://rmurphey.com/blog/2010/12/25/deferreds-coming-to-jquery/
fuente
$.when(function1).then(function2);
(sin los paréntesis que llaman a la función)?function1
Debería devolver una promesa. En ese caso, debe ser la función ejecutada real, no la referencia. Cuandoresolve
se llama a esa promesa,function2
se ejecuta. Esto se explica fácilmente asumiendo quefunction1
tiene una llamada ajax. Ladone
devolución de llamada resolvería la promesa. Espero que sea claro.Prueba esto :
fuente
Esta respuesta utiliza
promises
, una característica de JavaScript delECMAScript 6
estándar. Si su plataforma de destino no es compatiblepromises
, complétela con PromiseJs .Las promesas son una forma nueva (y mucho mejor) de manejar operaciones asincrónicas en JavaScript:
Esto puede parecer una sobrecarga significativa para este ejemplo simple, pero para un código más complejo es mucho mejor que usar devoluciones de llamada. Puede encadenar fácilmente múltiples llamadas asincrónicas utilizando múltiples
then
declaraciones:También puede ajustar los aplazamientos de jQuery fácilmente (que se devuelven de las
$.ajax
llamadas):Como señaló @charlietfl, el
jqXHR
objeto devuelto por$.ajax()
implementa laPromise
interfaz. Por lo tanto, no es realmente necesario envolverlo en unPromise
, se puede usar directamente:fuente
Promise.resolve
el envoltorio$.ajax
es antipatrón ya que$.ajax
devuelve la promesa posiblePromise
, solo implementa la interfaz. No estoy seguro de cómo se comporta cuando pasa un realPromise
a suthen
método, o quéPromise.all
haría si ajqXHR
y aPromise
se le pasaran. Para eso necesito hacer más pruebas. Pero gracias por la pista, ¡lo agregaré a la respuesta!$.ajax.then
no es nuevoO puede activar un evento personalizado cuando se completa una función, luego vincularlo al documento:
Con este método, la función 'b' solo puede ejecutarse DESPUÉS de la función 'a', ya que el disparador solo existe cuando la función a termina de ejecutarse.
fuente
puedes hacerlo asi
fuente
Esto depende de qué función esté haciendo.
Si function1 está haciendo un javascript sincrónico simple, como actualizar un valor div o algo así, function2 se activará después de que se haya completado function1.
Si function1 está haciendo una llamada asincrónica, como una llamada AJAX, deberá crear un método de "devolución de llamada" (la mayoría de las API de ajax tienen un parámetro de función de devolución de llamada). Luego llame a function2 en la devolución de llamada. p.ej:
fuente
Si el método 1 tiene que ejecutarse después de los métodos 2, 3, 4. El siguiente fragmento de código puede ser la solución para esto usando el objeto diferido en JavaScript.
fuente
Si function1 es alguna función de sincronización que desea convertir en una asíncrona porque lleva un tiempo completarla, y no tiene control sobre ella para agregar una devolución de llamada:
El resultado será:
... y después de 2 segundos:
Esto funciona porque llamar a window.setTimeout () agregará una tarea al bucle de tareas de rutina JS, que es lo que hace una llamada asíncrona, y porque el principio básico de "ejecución hasta la finalización" del tiempo de ejecución de JS asegura que onClick () nunca se interrumpe antes de que termine.
Tenga en cuenta que esto es tan divertido como puede ser difícil de entender el código ...
fuente