Подтвердить что ты не робот

Что такое "Планировщик" в RxJS

Я очень часто рассматривал термин Scheduler в документации.

Но что означает этот термин? Я даже не знаю, как использовать так называемый Scheduler. Официальная документация не сообщила мне, что такое Scheduler. Является ли это просто общей концепцией или конкретной концепцией в RxJS?

4b9b3361

Ответ 1

Планировщики Rx предоставляют абстракцию, которая позволяет планировать работу, возможно, в будущем, без вызова кода, который должен быть осведомлен о механизме, используемом для планирования работы.

Всякий раз, когда Rx-метод должен генерировать уведомление, он планирует работу над планировщиком. Предоставляя планировщик методу Rx вместо использования по умолчанию, вы можете тонко контролировать, как эти уведомления отправляются.

На серверных реализациях Rx (таких как Rx.NET) планировщики играют важную роль. Они позволяют планировать работу с большими нагрузками в пуле потоков или выделенных потоках и запускать окончательную подписку на поток пользовательского интерфейса, чтобы вы могли обновить свой интерфейс.

При использовании RxJs на самом деле довольно редко приходится беспокоиться о аргументе планировщика большинству методов. Поскольку JavaScript по существу однопоточен, для планирования не так много вариантов, и планировщики по умолчанию обычно являются правильным выбором.

Единственный реальный выбор:

  • immediateScheduler - Работает синхронно и немедленно. Похоже, что вы не используете планировщик вообще. Гарантируется, что запланированная работа будет выполняться синхронно.
  • currentThreadScheduler - Аналогично immediateScheduler в том, что работа выполняется немедленно. Однако он не работает рекурсивно. Итак, если работа выполняется и расписано больше работы, то дополнительная работа запускается в очередь, которая будет запущена после завершения текущей работы. Таким образом, работа иногда выполняется синхронно, а иногда и асинхронно. Этот планировщик полезен, чтобы избежать или бесконечной рекурсии. Например, Rx.Observable.of(42).repeat().subscribe() приведет к бесконечной рекурсии, если она запускается в планировщике immediate, но поскольку return работает по планировщику currentThread по умолчанию, исключается бесконечная рекурсия.
  • timeoutScheduler - единственный планировщик, который поддерживает запланированную работу в будущем. По существу использует setTimeout, чтобы запланировать всю работу (хотя, если вы планируете выполнение работы "сейчас", то она использует другие более быстрые асинхронные методы для планирования работы). Любая работа, запланированная на этом планировщике, гарантируется как выполняемая асинхронно.

Теперь может быть еще несколько, например планировщик, планирующий работу с кадрами анимации браузера и т.д.

Если вы пытаетесь написать тестируемый код, вы почти всегда хотите предоставить аргумент планировщика. Это связано с тем, что в ваших модульных тестах вы создадите экземпляры testScheduler, которые позволят вашему unit test управлять часами, используемыми вашим кодом Rx (и, таким образом, управлять точным временем операций).