Ответ 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 (и, таким образом, управлять точным временем операций).