【问题标题】:Rxjs: What scenario do you want to use schedulerRxjs:你想在什么场景下使用调度器
【发布时间】:2016-08-18 04:58:21
【问题描述】:

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

【问题讨论】:

标签: javascript scheduler reactive-programming rxjs rxjs5


【解决方案1】:

&tldr;

在大多数情况下,您永远不需要关心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 或其他一些虚假时间尺度相关联,这将需要使用类似AnimationFrameSchedulerVirtualTimeScheduler 之类的东西.


【讨论】:

    【解决方案2】:
    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 example

    【讨论】:

      猜你喜欢
      • 2018-06-08
      • 1970-01-01
      • 1970-01-01
      • 2016-11-09
      • 1970-01-01
      • 2022-01-02
      • 1970-01-01
      • 2013-05-25
      • 2019-05-09
      相关资源
      最近更新 更多