如何在没有延迟的情况下立即启动Observable Interval?

时间:2017-05-24 18:19:16

标签: rxjs reactivex

我希望我的观察能够立即射击,并且每秒钟都会射击。 interval不会立即开火。我发现this question建议使用startWith,它会立即触发,但我会先获得重复的第一个条目。

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

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

如何立即点火,但不能复制第一个条目?

4 个答案:

答案 0 :(得分:18)

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

答案 1 :(得分:6)

代表

  

RxJs 6

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

在rxjs 5.5.6

import {interval} from 'rxjs/observable/interval';
import 'rxjs/add/operator/startWith';

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

或使用计时器:

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

    });

答案 2 :(得分:2)

使用RxJava2,重复的第一个条目没有问题,这个代码工作正常:

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

请注意,您需要在startWith中传递Long,因此0L

答案 3 :(得分:0)

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)