如何让可观察间隔立即开始而不延迟?

问题描述 投票:0回答:4

我希望我的可观察对象立即触发,并且每秒再次触发。

interval
不会立即触发。我发现这个问题建议使用
startWith
,它会立即触发,但随后我得到了重复的第一个条目。

  Rx.Observable.interval(1000).take(4).startWith(0).subscribe(onNext);

https://plnkr.co/edit/Cl5DQ7znJRDe0VTv0Ux5?p=preview

如何立即使间隔触发,但不重复第一个条目?

rxjs reactivex
4个回答
100
投票

RxJs 6 之前:

Observable.timer(0, 1000)
将立即开始。

RxJs 6+

import {timer} from 'rxjs/observable/timer';
timer(0, 1000).subscribe(() => { ... });

48
投票

RxJs 6. 注意:使用此解决方案,

0
值将发射两次(一次由
startWith
立即发出,一次由
interval
在第一个“滴答声”后流发出,所以如果您关心发出的值,您可以考虑 startWith(-1) 而不是 startWith(0)

interval(100).pipe(startWith(0)).subscribe(() => { //your code }); 

或使用定时器:

import {timer} from 'rxjs/observable/timer';
timer(0, 100).subscribe(() => {

    });

9
投票

使用 RxJava2,不存在重复的第一个条目的问题,并且此代码工作正常:

io.reactivex.Observable.interval(1, TimeUnit.SECONDS)
        .startWith(0L)
        .subscribe(aLong -> {
            Log.d(TAG, "test");    // do whatever you want
    });

注意,您需要在 startWith 中传递

Long
,因此
0L


3
投票

RxJava 2

如果要生成每个值延迟

D
秒的序列 [0, N],请使用以下重载:

Observable<Long> interval(long initialDelay, long period, TimeUnit unit)

initialDelay - 发出第一个值 0L 之前等待的初始延迟时间

Observable.interval(0, D, TimeUnit.SECONDS).take(N+1)

您也可以尝试使用

startWith(0L)
但它会生成如下序列:
{0, 0, 1, 2...}

我相信类似的东西也能完成这项工作:

Observable.range(0, N).delayEach(D, TimeUnit.SECONDS)
© www.soinside.com 2019 - 2024. All rights reserved.