Я не понимаю, что означает планировщик в документации rxjs, поэтому я пытаюсь понять по сценарию, в котором он полезен, чтобы я мог понять планировщик
Rxjs: какой сценарий вы хотите использовать планировщик
Ответы (2)
<сильный>сильный>
В большинстве случаев вам никогда не придется беспокоиться о Schedulers
хотя бы потому, что в 90% случаев по умолчанию все в порядке.
Пояснение
Scheduler
— это просто способ стандартизации времени при использовании RxJS. Он эффективно планирует события в будущем.
Мы делаем это, используя метод schedule
для постановки в очередь новых операций, которые планировщик будет выполнять в будущем. То, как это делает Scheduler
, полностью зависит от реализации. Хотя часто речь идет просто о выборе наиболее эффективных средств выполнения будущего действия.
Возьмем простой пример, когда мы используем оператор timer
для выполнения действия в будущем.
var source = Observable.timer(500);
Это довольно стандартная плата за проезд для RxJS. Scheduler
появляется, когда вы задаете вопрос, что означает 500? В случае по умолчанию это будет равно 500 миллисекундам, потому что таково соглашение, и именно это будет делать Scheduler
по умолчанию, он будет ждать 500 миллисекунд, а затем сгенерирует событие.
Однако бывают случаи, когда мы не хотим, чтобы течение времени работало нормально. Наиболее распространенный вариант использования этого — когда мы тестируем. На самом деле мы не хотим ждать 500 миллисекунд для завершения задачи, иначе наш набор тестов занял бы целую вечность для фактического завершения!
В этом случае мы действительно хотели бы контролировать течение времени, чтобы нам не приходилось ждать, пока истечет 500 миллисекунд, прежде чем мы сможем проверить результат потока. В этом случае мы могли бы использовать TestScheduler
, который может выполнять задачи синхронно, чтобы нам не приходилось иметь дело с каким-либо асинхронным беспорядком.
let scheduler = new TestScheduler();
//Overrides the default scheduler with the default scheduler
let source = Observable.timer(500, scheduler);
//Subscribe to the source, which behaves normally
source.subscribe(x => expect(x).to.be(0));
//When this gets called all pending actions get executed.
scheduler.flush();
Есть еще несколько крайних случаев, когда мы также хотим изменить течение времени. Например, если мы работаем в контексте игры, мы, вероятно, захотим связать наше расписание с requestAnimationFrame
или с какой-либо другой искусственной шкалой времени, что потребует использования чего-то вроде AnimationFrameScheduler
или VirtualTimeScheduler
.
- Сценарий 1
у вас есть начальное значение и вы хотите, чтобы подписчик получил сначала начальное значение, а затем другое значение (в зависимости от условия).
const dispatcher = (new BehaviorSubject("INITIAL"))
.pipe(observeOn(asyncScheduler));
let did = false; // condition
dispatcher.pipe(
tap((value) => {
if(!did) {
did = true;
dispatcher.next("SECOND");
}
}))
.subscribe((state) => {
console.log('Subscription value: ', state);
});
//Output: Initial ... SECOND
Без .pipe(observeOn(asyncScheduler)) будет выводиться наоборот, поскольку Subject .next является операцией синхронизации.