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 function2se llame solo después de que se function1haya completado?
javascript
jquery
Rrryyyaaannn
fuente
fuente

function1realizando una operación asincrónica?Respuestas:
Especifique una devolución de llamada anónima y haga que function1 lo acepte:
fuente
...do stuffcontiene 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 stuffen 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)?function1Debería devolver una promesa. En ese caso, debe ser la función ejecutada real, no la referencia. Cuandoresolvese llama a esa promesa,function2se ejecuta. Esto se explica fácilmente asumiendo quefunction1tiene una llamada ajax. Ladonedevolución de llamada resolvería la promesa. Espero que sea claro.Prueba esto :
fuente
Esta respuesta utiliza
promises, una característica de JavaScript delECMAScript 6está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
thendeclaraciones:También puede ajustar los aplazamientos de jQuery fácilmente (que se devuelven de las
$.ajaxllamadas):Como señaló @charlietfl, el
jqXHRobjeto devuelto por$.ajax()implementa laPromiseinterfaz. Por lo tanto, no es realmente necesario envolverlo en unPromise, se puede usar directamente:fuente
Promise.resolveel envoltorio$.ajaxes antipatrón ya que$.ajaxdevuelve la promesa posiblePromise, solo implementa la interfaz. No estoy seguro de cómo se comporta cuando pasa un realPromisea suthenmétodo, o quéPromise.allharía si ajqXHRy aPromisese le pasaran. Para eso necesito hacer más pruebas. Pero gracias por la pista, ¡lo agregaré a la respuesta!$.ajax.thenno 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