Rxjs: какой сценарий вы хотите использовать планировщик

Я не понимаю, что означает планировщик в документации rxjs, поэтому я пытаюсь понять по сценарию, в котором он полезен, чтобы я мог понять планировщик


person blackHawk    schedule 18.08.2016    source источник
comment
Я записал весь видеокурс по rxjs6. Планировщики — одна из тем, которые я рассматриваю здесь: packtpub.com/ веб-разработка/руки-rxjs-веб-разработка-видео   -  person Alexander Poshtaruk    schedule 24.04.2019


Ответы (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.


person paulpdaniels    schedule 18.08.2016

  1. Сценарий 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 является операцией синхронизации.

пример codepen

person Alexander Poshtaruk    schedule 15.10.2018