2011-02-17 5 views
5

Si tuviera que llamar a una función (todos escritos en Java):¿Cuán lejos se ejecutará GWT AsyncCallback mientras espera la respuesta?

public int hello() { 
int a = 1; 
executeCallback(); 
// C: Question lies in this range 
return a; 
} 

public void executeCallback() { 
// A: random code to execute before asynccallback 
    randomClass.randomMethod(int a, int b, AsyncCallback<ReturnType>() { 
     onSuccess(); 
     onFailure(); 
    }); 
// B: random code to execute after asynccallback 
} 

entiendo que las cosas en el comentario Un ejecutará, y al mismo tiempo la randomMethod no sincrónica ejecutará y el comentario en B ejecutará .

Me preguntaba, sin embargo, mientras randomMethod se está ejecutando (si toma suficiente tiempo), ¿devolverá la función a su llamador (en este caso el método 'hola') y comenzará a ejecutar el código en el comentario C? ¿O ejecutará Callback para que randomMethod termine antes de que vuelva?

Y si es la primera, supongamos que necesito la información que randomMethod toca para ser tocada antes de poder continuar con el comentario C, ¿cómo puedo hacer que 'espere' para asegurarme de que sea así?

Respuesta

3

Cuando se llama al método asíncrono, el programa no espera ese método, es por eso que se llaman asincrónicos. No hay forma de que los métodos randomMethod AsyncCallback onSuccess o OnFailure se ejecuten antes que el código representado como B .. Debido a que el navegador ejecuta código javascript en un solo subproceso, los métodos onSuccess o OnFailure se ejecutan después de que el llamador del método executeCallBack finaliza.

Si desea que el código B y el código C se ejecuten después de randomMethod, debe ponerlos en el método de éxito, como;

randomClass.randomMethod(int a, int b, AsyncCallback<ReturnType>() { 
     onSuccess() { 
     // B: random code to execute after asynccallback 
     // C: Question lies in this range 
     } 
     } 
     onFailure() 
    }); 
1

1] comunicación asíncrona puede tomar un poco de tiempo para acostumbrarse. Debe recordar que el cliente continúa con la siguiente declaración inmediatamente después de la llamada al procedimiento remoto, sin importar cuánto tiempo tome la ejecución del procedimiento en el servidor y la transmisión de datos desde el servidor al cliente.

2] Puede ejecutar // C: pregunta se encuentra en este rango en el método onSuccess

2

Voy a explicar el modelo de ejecución un poco, ya que a veces es más fácil si usted sabe lo que sucede "detrás de las escenas".

El navegador inicia la ejecución de todos los códigos. Esto sucede en ciertos eventos, p. cuando la página se carga, cuando el usuario ha hecho clic en algo o cuando llega una respuesta AJAX.

Entonces, lo que debe hacer al escribir una aplicación GWT (u otra aplicación de JavaScript) es que registre controladores, p. usando onModuleLoad(), o registrando un ClickHandler en un Botón, o un AsyncCallback a una llamada GWT-RPC.

Lo interesante (¿y tal vez contra-intuitivo?) Es que cuando el navegador llama a dicho controlador, se ejecuta hasta que finaliza (o hasta que se produce un error). Solo después de eso, se ejecutarán otros manejadores. Esto también significa, por cierto, que si el código de un manejador contiene un bucle sin fin, nunca se ejecutarán otras devoluciones de llamada: toda la pestaña del navegador se bloqueará.

Así que cuando se ejecuta su método hello(), esto se hace como parte de algún controlador (por ejemplo, onModuleLoad o ClickHandler).It

  • conjuntos a = 1,
  • continuación, envía una petición AJAX (randomClass.randomMethod),
  • registra otra AsyncCallback Handler (recuerde, esto es sólo un registro. El navegador primero terminar el manejador actual, antes de que pueda llegar a realmente ejecutar ese controlador AsyncCallback).
  • ejecuta B
  • realiza un
  • continúa ejecutando hasta la jerarquía de llamada, hasta que se termine el manejador.
Cuestiones relacionadas