Angular/RxJS:如何生成延迟值序列?
我有一系列的信息。 每隔Angular/RxJS:如何生成延迟值序列?,angular,rxjs,observable,Angular,Rxjs,Observable,我有一系列的信息。 每隔N秒,我需要从Observable发出一条消息 我尝试了下一个代码。第一条消息是延迟发出的,我在订阅服务器中得到了它,但按顺序生成其他消息的操作停止了。 如果我删除.delay()方法调用,我将获得所需的序列,订阅者将对每条消息做出反应,但消息之间没有时间间隔。我怎样才能修好它 import { Observable } from 'rxjs/Observable'; import { fromArray } from 'rxjs/observable/fromArray
N
秒,我需要从Observable发出一条消息
我尝试了下一个代码。第一条消息是延迟发出的,我在订阅服务器中得到了它,但按顺序生成其他消息的操作停止了。
如果我删除.delay()
方法调用,我将获得所需的序列,订阅者将对每条消息做出反应,但消息之间没有时间间隔。我怎样才能修好它
import { Observable } from 'rxjs/Observable';
import { fromArray } from 'rxjs/observable/fromArray';
import 'rxjs/add/operator/delay';
@Injectable({
providedIn: 'root'
})
export class MessageService {
constructor() { }
getIncomingMessagesStream(): Observable<string> {
const messageTimeout = 2000;
const messages = ['Hi there!', 'How are you?', 'That is awesome :)'];
return fromArray(messages)
.delay(messageTimeout);
}
}
只有在上一个项目延迟后,才需要使链发射下一个项目:
import { from, of } from 'rxjs';
import { delay, concatMap } from 'rxjs/operators';
...
return from(messages).pipe(
concatMap(item => of(item).pipe(delay(messageTimeout))),
);
顺便说一句,您正在结合RxJS=5.5样式(可管道化和原型化的操作符样式)。最好只使用RXJS5.5,避免导入“RxJS/add/operator/concatMap”代码>。看
2019年7月:RxJS 6更新
请参阅live demo:这很奇怪,但我得到了相同的结果,订阅服务器仅对第一条消息有效。@Alexchali好吧,问题一定是在其他地方,因为它工作正常:我注意到序列对第一条消息有效,然后如果在测试中的订阅服务器中使用expect()方法,它将停止。它怎么停下来的?您确定这不是因为
延迟()。如果要测试实时工作的链,应使用TestScheduler
:
import { from, of } from 'rxjs';
import { delay, concatMap } from 'rxjs/operators';
...
return from(messages).pipe(
concatMap(item => of(item).pipe(delay(messageTimeout))),
);