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();