web-dev-qa-db-fra.com

qu'est-ce qu'un `Scheduler` dans RxJS

J'ai vu le terme Scheduler très fréquemment dans la documentation.

Mais que signifie ce terme? Je ne sais même pas comment utiliser un soi-disant Scheduler. La documentation officielle ne m'a pas dit exactement ce qu'est un Scheduler. S'agit-il simplement d'un concept commun ou d'un concept spécifique dans RxJS?

66
yaquawa

Les planificateurs Rx fournissent une abstraction qui permet de planifier l'exécution du travail, éventuellement à l'avenir, sans que le code appelant ait besoin de connaître le mécanisme utilisé pour planifier le travail.

Chaque fois qu'une méthode Rx doit générer une notification, elle planifie le travail sur un planificateur. En fournissant un planificateur à la méthode Rx au lieu d'utiliser la valeur par défaut, vous pouvez contrôler subtilement la façon dont ces notifications sont envoyées.

Dans les implémentations côté serveur de Rx (telles que Rx.NET), les planificateurs jouent un rôle important. Ils vous permettent de planifier des travaux lourds sur le pool de threads ou les threads dédiés, et d'exécuter l'abonnement final sur le thread d'interface utilisateur afin que vous puissiez mettre à jour votre interface utilisateur.

Lorsque vous utilisez RxJs, il est en fait assez rare que vous ayez à vous soucier de l'argument du planificateur pour la plupart des méthodes. Étant donné que JavaScript est essentiellement monothread, il n'y a pas beaucoup d'options pour la planification et les planificateurs par défaut sont généralement le bon choix.

Les seuls vrais choix sont:

  • immediateScheduler - Exécute le travail de manière synchrone et immédiate. Un peu comme ne pas utiliser du tout de planificateur. Le travail planifié est ainsi garanti de fonctionner de manière synchrone.
  • currentThreadScheduler - Similaire à immediateScheduler en ce que le travail est exécuté immédiatement. Toutefois, il ne s'exécute pas récursivement. Donc, si le travail est en cours d'exécution et planifie plus travail, alors ce travail supplémentaire est mis en file d'attente pour être exécuté une fois le travail en cours terminé. Ainsi, le travail s'exécute parfois de manière synchrone et parfois asynchrone. Ce planificateur est utile pour éviter les débordements de pile ou la récursion infinie. Par exemple, Rx.Observable.of(42).repeat().subscribe() provoquerait une récursion infinie si elle s'exécutait sur le planificateur immediate, mais puisque return s'exécute sur le planificateur currentThread par défaut, la récursion infinie est évité.
  • timeoutScheduler - Le seul planificateur qui prend en charge le travail planifié pour être exécuté à l'avenir. Utilise essentiellement setTimeout pour planifier tout le travail (bien que si vous planifiez l'exécution du travail "maintenant", il utilise d'autres méthodes asynchrones plus rapides pour planifier le travail). Tout travail planifié sur ce planificateur est garanti pour être exécuté de manière asynchrone.

Il peut y en avoir plus maintenant, comme un planificateur qui planifie le travail sur les images d'animation du navigateur, etc.

Si vous essayez d'écrire du code testable, vous voulez presque toujours fournir l'argument du planificateur. En effet, dans vos tests unitaires, vous créerez des instances testScheduler, qui permettront à votre test unitaire de contrôler l'horloge utilisée par votre code Rx (et donc de contrôler le timing exact des opérations).

128
Brandon