Tengo una configuración de función de devolución de llamada de JavaScript como esta

function myFunction(callback){

    $('meta[name="viewport"]').prop('content', 'width=1440');
    //other code
    callback()
}

function otherFunction(){
   //some async operation
}

myFunction(otherFunction)

¿Este código garantiza que mi otherFunction no se ejecute antes de que se modifique la ventana gráfica y se implemente otro código anterior?

2
greenn 14 sep. 2018 a las 14:19

4 respuestas

La mejor respuesta

Si todo el código sobre la llamada callback es síncrono, entonces sí, otherFunction se ejecutará después de todo el código anterior.

4
Pedro Brost 14 sep. 2018 a las 11:24

Aquí está la mejor manera de verlo. Aquí he agregado una declaración justo antes de callBack function. Puede ver el registro de la consola incluso después de la ejecución otherfunction. Por lo tanto, depende completamente de si está utilizando el código synchronous o asynchronous antes de la función invocation.

function myFunction(callback){

    $('#ipt').val(callback.name);
    //other code
    setTimeout(function(){console.log('hello')},5000)
    callback()
}

function otherFunction(){
   alert( $('#ipt').val());
}

myFunction(otherFunction)
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js"></script>
<input type="text" id="ipt" placeholder="Dummy text"/>
1
manikant gautam 14 sep. 2018 a las 11:43

Las funciones de devolución de llamada asincrónicas siempre se ejecutarán después de que se haya completado todo el código síncrono. Esto se debe a que JS tiene algo llamado bucle de eventos que se ve de la siguiente manera:

enter image description here

Siempre que hacemos operaciones asincrónicas, a menudo esto está asociado con una API web. Esta API web se extrae de nosotros. No necesitamos saber cómo implementa el navegador esta característica (que probablemente está escrita en C ++ como parte del navegador). Sin embargo, estamos interesados en el valor de la operación o el valor de retorno eventual.

Entonces, lo que hace el navegador es que cada vez que los webAPI terminan, la devolución de llamada asociada con él se inserta en la cola de devolución de llamada . Luego, cuando la pila esté vacía, el bucle de eventos empujará una función en la pila.

Esta es la razón por la cual las operaciones asincrónicas siempre se realizarán en último lugar, porque el bucle de eventos esperará a que la pila esté vacía antes de presionar un elemento sobre ella.

1
Willem van der Veen 14 sep. 2018 a las 11:39

Sí, se asegurará de que myFunction se ejecutará después de todo el código que se encuentra arriba si y solo si el código que se encuentra arriba de callback() también es sincrónico. Por ejemplo, se garantiza que callback() solo se ejecutará una vez que se haya cambiado la ventana gráfica.

0
Shahid Kamal 14 sep. 2018 a las 11:46