Rxjs:您希望使用调度程序的场景

时间:2016-08-18 04:58:22

标签: javascript scheduler reactive-programming rxjs rxjs5

我不明白rxjs文档中调度程序的含义是什么,所以我试图通过它有用的场景来理解,所以我可以理解调度程序

2 个答案:

答案 0 :(得分:8)

<强>&安培; tldr;

在大多数情况下,如果只有90%的情况下默认是正常的话,你永远不需要关心Schedulers

<强>解释

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或其他一些虚假的时间尺度相关联,这将需要使用类似AnimationFrameSchedulerVirtualTimeScheduler

答案 1 :(得分:0)

  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)),由于主题.next是同步操作,它将输出vise-verse。

codepen example