2012-03-14 29 views
6

Me gustaría implementar una página que se mostrará al usuario mientras se ejecuta un comando del sistema. Tan pronto como se completa el comando, el usuario debe enrutarse a otra página.Cómo puedo escribir una página de carga con play framework

¿Cuáles son algunas estrategias para implementar esto?

(Una solución sin javascript sería ideal)

Respuesta

4

Definitivamente se puede hacer. Si desea consultar Asynchronous programming with HTTP en la documentación, explica cómo hacerlo de forma no bloqueante. Sin embargo, necesitarás un poco de javascript para la parte de redirigir.

Y no sé lo que quiere decir con "comando del sistema", pero es probable que desee create a job para ello, por lo que puede activarlo con una solicitud. Luego puede poll it hasta que finalice y luego redirigir al usuario. Pero realmente la documentación hace un trabajo infinitamente mejor al explicarlo, entonces lo estoy haciendo ahora.

Aquí hay un ejemplo de una acción de controlador donde asumo que el comando del sistema devuelve algún tipo de salida de cadena para el usuario. Cuando se complete el trabajo, enviará una respuesta al usuario, lo que activará el controlador de éxito en el ejemplo de javascript.

public static void executeSystemCommand(String input) { 
    Promise<String> outputPromise = new SystemCommandJob(input).now(); 
    String output = await(outputPromise); 
    renderText(output); 
} 

Básicamente, si estás usando jQuery $.ajax se puede utilizar el evento completa a pedir los datos (acaba de hacer la solicitud de nuevo si no tuvo éxito dentro del tiempo de espera) y utilizar el éxito /hecho hecho para redirigir al usuario cuando la aplicación responde para indicar que el "comando del sistema" está en ejecución.

ejemplo de una función que puede usar:

function poll(){ 
    $.ajax({ 
     url: "/systemcommand", 
     success: function(data){ 
      // redirect to next page here 
      document.location.href = '/output' 
     }, 
     complete: poll, 
     timeout: 20000 
    }); 
}; 

También hay a great example on long polling en javascript en StackOverflow.