我希望我的观察能够立即射击,并且每秒钟都会射击。 interval
不会立即开火。我发现this question建议使用startWith
,它会立即触发,但我会先获得重复的第一个条目。
Rx.Observable.interval(1000).take(4).startWith(0).subscribe(onNext);
https://plnkr.co/edit/Cl5DQ7znJRDe0VTv0Ux5?p=preview
如何立即点火,但不能复制第一个条目?
答案 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)
如果要生成每个值延迟 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)