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))),
);