Exécution d'agencements de graphe dans des unités d'exécution Web Worker

Lorsque vous exécutez un agencement de graphe côté client, vous risquez de bloquer l'interface utilisateur du navigateur pendant cette exécution. Vous pouvez éviter le blocage du navigateur en exécutant l'agencement dans une unité d'exécution Web Worker ou sur un serveur. Pour afficher un graphe agencé par un Web Worker, les navigateurs client doivent prendre en charge les unités d'exécution Web Worker HTML 5. (Les unités d'exécution Web Worker sont prises en charge par les navigateurs Chrome et Firefox les plus récents, mais ne sont pas prises en charge dans Internet Explorer pour l'instant.)
Pour les agencements de graphe d'unité d'exécution Web Worker, configurez les algorithmes d'agencement sur une instance Graph à l'aide des méthodes setNodeLayout et setLinkLayout standard. Au lieu d'appeler la méthode performGraphLayout, créez une instance WebWorkerLayout avec le graphe comme argument, puis appelez sa méthode layout. L'agencement de graphe est exécuté en mode asynchrone dans une unité d'exécution distincte.
Note
Comme dans toutes les applications à unités d'exécution multiples, vous devez concevoir votre application pour l'exécution d'agencement de graphe asynchrone. Votre application ne doit pas modifier le graphe pendant l'exécution de l'agencement. Sinon, toutes les modifications effectuées côté client sont écrasées lorsque l'agencement est terminé.
Exécutez les agencements de graphe dans une unité d'exécution Web Worker HTML 5 comme dans l'exemple suivant :
var treeLayout = new ibm_ilog.graphlayout.tree.TreeLayout();
graph.setNodeLayout(treeLayout);
var workerLayout = new ibm_ilog.graphlayout.WebWorkerLayout(graph);
var deferred = workerLayout.layout();
La méthode layout sur l'instance WebWorkerLayout renvoie immédiatement l'unité d'exécution en cours sans attendre la fin de l'exécution de l'agencement de graphe. L'interface utilisateur du navigateur reste active et votre application peut poursuivre les autres traitements. Lorsque l'exécution de l'agencement de graphe est terminée, les nouvelles positions de noeud et formes de lien sont appliquées automatiquement au graphe.
L'exécution d'un agencement de graphe dans une unité d'exécution Web Worker nécessite un temps d'initialisation significatif, car cette unité d'exécution est isolée de l'unité d'exécution d'application principale. L'unité d'exécution Web Worker doit recharger le code d'algorithme d'agencement de graphe et du code Dojo. Si vous exécutez le même algorithme d'agencement de graphe plusieurs fois, vous pouvez supprimer ce temps de traitement dans les agencements suivants en réutilisant la même instance WebWorkerLayout.
Note
L'utilisation de la classe WebWorkerLayout est similaire à celle de la classe ServerSideLayout, mais comme l'agencement est exécuté par le navigateur, une installation distincte d'un composant de service Web n'est pas nécessaire. Pour plus d'informations sur l'agencement de graphe côté serveur, voir Exécution d'agencements de graphe sur un serveur.

Ajout de rappels

La méthode layout sur l'instance WebWorkerLayout renvoie un objet dojo.Deferred qui peut être utilisé pour vous avertir lorsque l'agencement est terminé. Appelez la méthode addCallback de l'objet dojo.Deferred pour fournir la notification. L'exemple suivant désactive un bouton lors de l'exécution de l'agencement, puis l'active lorsque l'agencement est terminé.
dijit.byId("layoutButton").attr("disabled", true);
var deferred = workerLayout.layout();
deferred.addCallback(function(){
   dijit.byId("layoutButton").attr("disabled", false); 
});
Vous pouvez également utiliser l'objet dojo.Deferred pour être averti si une erreur se produit lors de l'exécution de l'agencement de graphe. Appelez la méthode addErrback pour la notification d'erreur d'agencement comme dans l'exemple suivant :
deferred.addErrback(function(e){ 
   alert(e);
   dijit.byId("layoutButton").attr("disabled", false);
});

Arrêt de l'unité d'exécution Web Worker

Vous pouvez arrêter l'exécution d'un agencement en appelant la méthode stop de l'objet WebWorkerLayout. Cela interrompt l'unité d'exécution Web Worker sans modifier le graphe :
workerLayout.stop();