Ejecución de diseños de gráficos en hebras Web Worker

Al ejecutar el diseño del gráfico en el cliente, nos arriesgamos a bloquear la interfaz de usuario del navegador durante la ejecución del diseño. Se puede evitar el bloqueo del navegador ejecutando el diseño en una hebra Web Worker o en un servidor. Para ver un gráfico presentado por una hebra Web Worker, los navegadores del cliente deben ser compatibles con las hebras Web Worker de HTML 5. (Los navegadores Chrome y Firefox más recientes son compatibles con las hebras Web Worker, pero en el momento de escribir esto, Internet Explorer no las admite).
Para diseños de gráficos en hebras Web Worker, configure los algoritmos de diseño en una instancia de Graph utilizando los métodos estándar setNodeLayout y setLinkLayout. En lugar de llamar al método performGraphLayout, cree una instancia de WebWorkerLayout con el gráfico como argumento y, a continuación, llame a su método layout. El diseño del gráfico se ejecuta de forma asíncrona en una hebra separada.
Nota
Al igual que en todas las aplicaciones de varias hebras, debe diseñar la aplicación de modo que ejecute el diseño de gráficos de forma asíncrona. La aplicación no debe modificar el gráfico mientras se está ejecutando el diseño. De lo contrario, cuando finalice la ejecución del diseño se sobrescribirán todos los cambios realizados en el cliente.
Ejecute los diseños de gráficos en una hebra Web Worker de HTML 5 como en el ejemplo siguiente:
var treeLayout = new ibm_ilog.graphlayout.tree.TreeLayout();
graph.setNodeLayout(treeLayout);
var workerLayout = new ibm_ilog.graphlayout.WebWorkerLayout(graph);
var deferred = workerLayout.layout();
El método layout en la instancia de WebWorkerLayout vuelve de inmediato a la hebra actual, sin esperar a que la ejecución del diseño del gráfico finalice. La interfaz de usuario del navegador permanece activa y la aplicación puede continuar con otro proceso. Cuando la ejecución del diseño del gráfico finaliza, las nuevas posiciones de los nodos y formas de los enlaces se aplican automáticamente al gráfico.
La ejecución de un diseño de gráficos en una hebra Web Worker necesita un tiempo de inicialización importante, ya que está aislada de la hebra de la aplicación principal. Se requiere que la hebra Web Worker vuelva a cargar el código del algoritmo de diseño de gráficos, así como algo de código de Dojo. Si ejecuta el mismo algoritmo de diseño de gráficos varias veces, puede eliminar este tiempo de proceso en los diseños posteriores reutilizando la misma instancia de WebWorkerLayout.
Nota
La clase WebWorkerLayout se utiliza de forma parecida a la clase ServerSideLayout; pero puesto que el diseño lo ejecuta el navegador, no necesita la instalación independiente de un componente de servicio web. Para obtener más información sobre el diseño de gráficos en el servidor, consulte Ejecución de diseños de gráficos en un servidor.

Añadir respuestas

El método layout en la instancia de WebWorkerLayout devuelve un objeto dojo.Deferred que puede utilizarse para notificarle de que la ejecución del diseño ha finalizado. Llame al método addCallback del objeto dojo.Deferred para proporcionar el servicio de notificación. En el ejemplo siguiente se inhabilita un botón durante la ejecución del diseño y, cuando finaliza la ejecución del diseño, se vuelve a habilitar:
dijit.byId("layoutButton").attr("disabled", true);
var deferred = workerLayout.layout();
deferred.addCallback(function(){
   dijit.byId("layoutButton").attr("disabled", false); 
});
También puede utilizar el objeto dojo.Deferred para que se le notifique si se produce un error durante la ejecución del diseño del gráfico. Llame al método addErrback para que se le notifiquen errores del diseño, como en el ejemplo siguiente:
deferred.addErrback(function(e){ 
   alert(e);
   dijit.byId("layoutButton").attr("disabled", false);
});

Cómo detener una hebra Web Worker

Se puede detener la ejecución del diseño llamando al método stop del objeto WebWorkerLayout. Esto interrumpe la hebra Web Worker sin modificar el gráfico:
workerLayout.stop();