지연으로 관찰 가능 항목을 생성하려면 어떻게해야합니까?


92

질문

테스트 목적으로 Observable실제 http 호출에 의해 반환되는 Observable을 Http.

내 관찰 가능 항목은 다음 코드로 생성됩니다.

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

문제는이 관찰 가능한 것이 즉시 방출된다는 것입니다. 방출에 사용자 지정 지연을 추가하는 방법이 있습니까?


과정

나는 이것을 시도했다 :

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

그러나 작동하지 않는 것 같습니다.



체인 .create(...)을 시도했지만 .delay(1000)작동하지 않았습니다. Observable_1.Observable.create (...). delay는 함수가 아닙니다.
Adrien Brunelat

1
정확히 무엇을 성취하려고합니까?
Günter Zöchbauer 2017

옵저버 블을 구독하고 있습니까?
shusson

내 자신의 관찰 가능한 HTTP 응답 지연을 가짜. @shusson 예, 테스트중인 클래스는 구독하기 위해 옵저버 블에 대한 서비스를 호출합니다 (조롱하려고합니다).
Adrien Brunelat

답변:


144

다음 가져 오기 사용 :

import {Observable} from 'rxjs/Observable';
import 'rxjs/add/observable/of';
import 'rxjs/add/operator/delay';

이 시도:

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

업데이트 : RXJS 6

위의 솔루션은 RXJS의 최신 버전 (예 : 각도)에서는 더 이상 작동하지 않습니다.

그래서 시나리오는 API로 확인할 항목 배열이 있다는 것입니다. API는 단일 항목 만 허용하며 모든 요청을 한 번에 전송하여 API를 종료하고 싶지 않습니다. 따라서 중간에 약간의 지연이있는 Observable 스트림에서 항목의 시간 제한 릴리스가 필요합니다.

다음 가져 오기를 사용하십시오.

import { from, of } from 'rxjs';
import { delay } from 'rxjs/internal/operators';
import { concatMap } from 'rxjs/internal/operators';

그런 다음 다음 코드를 사용하십시오.

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

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

기본적으로 배열의 모든 항목에 대해 새로운 '지연된'Observable을 생성합니다. 다른 많은 방법이있을 수 있지만 이것은 나에게 잘 작동했으며 '새로운'RXJS 형식을 준수합니다.


2
'of'속성이 'typeof Observable'유형에 없습니다. Observable을로 가져 오나요 import {Observable} from 'rxjs/Observable';?
Adrien Brunelat

1
이 페이지에서 : npmjs.com/package/rxjs . 나는 명시 적으로 import 'rxjs/add/observable/of';. 당신도 같은 일을하나요? 그래도 .delay (...)와 연결되지 않고 시도 할 때 오류가 표시되기 때문에 여전히 이상합니다 rxjs/add/observable/delay.
Adrien Brunelat

4
해야 of(item.pipe ( delay( 1000 ) ))of(item))).pipe(delay(1000)파이프에 노력 배열은 나에게 오류를 준
돈 토마스 보일

1
이것은 rxjs6에서 나를 위해 일한 것입니다 : from ([1, 2, 3, 4, 5, 6, 7]). pipe (concatMap (num => of (num) .pipe (delay (1000)))). 구독 (x => console.log (x));
robert

1
@MikeOne의 솔루션이 저에게도 효과적이었습니다. 슬픈 너무 많은 코드는 ... 같은 간단한 문제에 대한 필요
Codev

103

RxJS 5+에서는 이렇게 할 수 있습니다.

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

fakeObservable = of('dummy').pipe(delay(5000));

RxJS 6+에서

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

fakeObservable = of('dummy').pipe(delay(5000));

각 방출 값을 지연 시키려면

from([1, 2, 3]).pipe(concatMap(item => of(item).pipe(delay(1000))));

4
제 생각에는 가장 깨끗한 솔루션입니다.
Maayao

이 "솔루션"은 하나의 항목을 내보내는 경우에만 작동합니다. 지연 연산자는 Observable의 각 요소에 대해 호출되지 않습니다. 이것이 무서운 concatMap 솔루션이 필요한 이유입니다.
Rick O'Shea

1
@ RickO'Shea, 문제는 하나의 방출 값에 관한 것이므로이 솔루션이 그 이유입니다.
Adrian Ber

1
너무 신선하고 깨끗합니다!
Nahn

@ RickO'Shea
Adrian Ber

12

원하는 것은 타이머입니다.

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

3
좋은 대답은 취소하는 것을 잊지 마세요
사미

8

대답하는 데 조금 늦었지만 누군가가이 질문에 답을 찾기 위해 돌아올 수도 있습니다.

'delay'는 Observable의 속성 (함수)입니다.

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

이것은 나를 위해 일했습니다 ...


1
import 'rxjs/add/operator/delay' 이제이 오류가 발생합니다. 모듈을 찾을 수 없음 : 오류 : 'rxjs / add / operator / delay'를 해결할 수 없습니다.
Aggie Jon of 87

당신은 그것이 아주 현실적 일 때 왜 당신을 관찰 가능한 가짜라고 부르겠습니까? :)
lagoman

0

import * as Rx from 'rxjs/Rx';

타격 코드가 작동하도록 위의 가져 오기를 추가해야합니다.

Let obs = Rx.Observable
    .interval(1000).take(3);

obs.subscribe(value => console.log('Subscriber: ' + value));
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.