如何创建具有延迟的可观察量

Adr*_*lat 64 observable typescript angular

出于测试目的,我正在创建Observable替换实际http调用返回的observable的对象Http.

我的observable是使用以下代码创建的:

fakeObservable = Observable.create(obs => {
  obs.next([1, 2, 3]);
  obs.complete();
});
Run Code Online (Sandbox Code Playgroud)

问题是,这个可观察到的立即发出.有没有办法为其排放添加自定义延迟?


跟踪

我试过这个:

fakeObservable = Observable.create(obs => {
  setTimeout(() => {
    obs.next([1, 2, 3]);
    obs.complete();
  }, 100);
});
Run Code Online (Sandbox Code Playgroud)

但它似乎没有用.

Mik*_*One 118

使用以下导入:

import {Observable} from 'rxjs/Observable';
import 'rxjs/add/observable/of';
import 'rxjs/add/operator/delay';
Run Code Online (Sandbox Code Playgroud)

试试这个:

let fakeResponse = [1,2,3];
let delayedObservable = Observable.of(fakeResponse).delay(5000);
delayedObservable.subscribe(data => console.log(data));
Run Code Online (Sandbox Code Playgroud)

更新:RXJS 6

上述解决方案在较新版本的RXJS(以及例如角度)中不再起作用.

所以场景是我有一个项目数组要检查API.API只接受一个项目,我不想通过一次发送所有请求来终止API.所以我需要在Observable流上定时释放项目,两者之间有一点延迟.

使用以下导入:

import { from, of } from 'rxjs';
import { delay } from 'rxjs/internal/operators';
import { concatMap } from 'rxjs/internal/operators';
Run Code Online (Sandbox Code Playgroud)

然后使用以下代码:

const myArray = [1,2,3,4];

from(myArray).pipe(
        concatMap( item => of(item).pipe ( delay( 1000 ) ))
    ).subscribe ( timedItem => {
        console.log(timedItem)
    });
Run Code Online (Sandbox Code Playgroud)

它基本上为数组中的每个项创建一个新的'延迟'Observable.可能有很多其他方法,但这对我来说很好,并符合'新'RXJS格式.

  • 应该(of(item.pipe(delay(1000)))`是(项目)).管道(延迟(1000)`试图管道阵列给我错误 (3认同)
  • 类型“typeof Observable”上不存在属性“of”。您是否使用 `import {Observable} from 'rxjs/Observable';` 导入 Observable? (2认同)
  • 这就是 rxjs6 对我有用的方法: from([1, 2, 3, 4, 5, 6, 7]).pipe(concatMap(num => of(num).pipe(delay(1000)))) 。订阅(x => console.log(x)); (2认同)

Adr*_*Ber 66

在RxJS 5+中你可以这样做

import { Observable } from "rxjs/Observable";
import { of } from "rxjs/observable/of";
import { delay } from "rxjs/operators";

fakeObservable = of('dummy').pipe(delay(5000));
Run Code Online (Sandbox Code Playgroud)

在RxJS 6+中

import { of } from "rxjs";
import { delay } from "rxjs/operators";

fakeObservable = of('dummy').pipe(delay(5000));
Run Code Online (Sandbox Code Playgroud)

  • 我认为最干净的解决方案。 (4认同)

mic*_*p78 8

现在回答的时间已经很晚了......但万一有人可能会回到这个问题寻找答案

'delay'是Observable的属性(函数)

fakeObservable = Observable.create(obs => {
  obs.next([1, 2, 3]);
  obs.complete();
}).delay(3000);
Run Code Online (Sandbox Code Playgroud)

这对我有用......

  • 当可观察到的东西相当真实时,为什么你会称它为假的呢?:) (2认同)

Pel*_*let 7

您想要的是一个计时器:

// RxJS v6+
import { timer } from 'rxjs';

//emit [1, 2, 3] after 1 second.
const source = timer(1000).map(([1, 2, 3]);
//output: [1, 2, 3]
const subscribe = source.subscribe(val => console.log(val));
Run Code Online (Sandbox Code Playgroud)

  • 很好的答案,别忘了取消订阅 (3认同)