Très ennuyeux quand on veut faire des choses un peu lourdes en calcul : l'interface utilisateur devient inutilisable
Opérations asynchrones, mais ne permettent pas vraiment la concurrence
Web workers
Permettent le multithreading, avec un modèle de passage de messages
NB: les navigateurs sont libres d'implémenter les workers avec des processus et pas des threads -> prudence
Ont un accès limité à certaines choses
sont dans un contexte spécial, le DedicatedWorkerGlobalScope, accessible avec le mot-clef self
pas d'accès à window, pas de modification du DOM possible
c'est le script principal qui s'occupe des relations avec l'« extérieur »
Objectifs : efficacité, les workers sont au maximum indépendants
pas de risque de modification concurrente du DOM
Passage de messages
envoi se fait avec postMessage (sur le worker, ou sur self dans le worker)
le worker et le script principal peuvent s'abonner aux MessageEvent, qui ont un attribut data
le contenu des messages est copié. Attention aux gros objets JSON par exemple
Objets transférables
On a souvent besoin de passer des gros objets aux workers, typiquement des données binaires
Ennuyeux de devoir les copier
On peut utiliser la transférabilité : l'objet est passé directement au worker, mais il n'est plus accessible à l'appelant (donc les problèmes sont évités)
Pour passer un objet par transfert, argument optionnel de Worker.postMessage contient la liste des objets devant être transférés
ArrayBuffer est transférable, mais pas les Typed Arrays par exemple