Executando Layouts de Gráfico em Encadeamentos do Web Worker

Ao executar o layout de gráfico no lado do cliente, você corre o risco de bloquear a interface com o usuário do navegador durante a execução do layout. É possível evitar a suspensão do navegador executando o layout em um encadeamento do Web Worker ou executando o layout em um servidor. Para visualizar um gráfico organizado por um Web Worker, os navegadores do cliente devem suportar encadeamentos do Web Worker HTML 5. (Os encadeamentos do Web Worker são suportados pelos navegadores Chrome e Firefox mais recentes, mas no momento desta publicação, eles não são suportados no Internet Explorer.)
Para os layouts de gráfico do encadeamento do Web Worker, configure os algoritmos de layout em uma instância Graph usando os métodos setNodeLayout e setLinkLayout padrão. Em vez de chamar o método performGraphLayout, crie uma instância WebWorkerLayout com o gráfico como argumento e, então, chame seu respectivo método layout. O layout de gráfico é executado de forma assíncrona em um encadeamento separado.
Nota
Como em todos os aplicativos multiencadeados, você deve projetar seu aplicativo para execução de layout de gráfico assíncrona. Seu aplicativo não deve modificar o gráfico durante a execução do layout. Do contrário, todas as mudanças feitas no lado do cliente serão sobrescritas quando o layout for concluído.
Execute layouts de gráfico em um encadeamento do Web Worker HTML 5 como no exemplo a seguir:
var treeLayout = new ibm_ilog.graphlayout.tree.TreeLayout();
graph.setNodeLayout(treeLayout);
var workerLayout = new ibm_ilog.graphlayout.WebWorkerLayout(graph);
var deferred = workerLayout.layout();
O método layout na instância WebWorkerLayout retorna imediatamente ao encadeamento atual, sem aguardar a conclusão da execução do layout de gráfico. A interface com o usuário do navegador permanece ativa e seu aplicativo pode continuar com outro processamento. Quando a execução do layout de gráfico estiver concluída, as novas posições de nós e as formas de links serão aplicadas ao gráfico automaticamente.
Executar um layout de gráfico em um Web Worker requer um tempo significativo de inicialização porque ele está isolado do encadeamento principal de aplicativos. Isso requer que o encadeamento do Web Worker recarregue o código do algoritmo do layout de gráfico e também um pouco de código Dojo. Se você executar o mesmo algoritmo de layout de gráfico várias vezes, é possível suprimir esse tempo de processamento nos layouts subsequentes pela reutilização da mesma instância WebWorkerLayout.
Nota
A classe WebWorkerLayout é semelhante em uso à classe ServerSideLayout; mas, como o layout é executado pelo navegador, ele não requer uma instalação separada de um componente de serviço da Web. Para obter informações sobre o layout de gráfico do lado do servidor, consulte Executando Layouts de Gráfico em um Servidor.

Incluindo Retornos de Chamada

O método layout na instância WebWorkerLayout retorna um objeto dojo.Deferred que pode ser usado para notificá-lo quando o layout estiver concluído. Chame o método addCallback do objeto dojo.Deferred para fornecer a notificação. O exemplo a seguir desativa um botão durante a execução do layout, em seguida, ativa-o quando o layout é concluído:
dijit.byId("layoutButton").attr("disabled", true);
var deferred = workerLayout.layout();
deferred.addCallback(function(){
   dijit.byId("layoutButton").attr("disabled", false); 
});
Também é possível usar o objeto dojo.Deferred para ser notificado se ocorrer um erro durante a execução do layout de gráfico. Chame o método addErrback para notificação de erro do layout, como no exemplo a seguir:
deferred.addErrback(function(e){ 
   alert(e);
   dijit.byId("layoutButton").attr("disabled", false);
});

Parando o Encadeamento do Web Worker

É possível parar a execução do layout chamando o método stop do objeto WebWorkerLayout. Isto interrompe o encadeamento do Web Worker sem modificar o gráfico:
workerLayout.stop();