Programing

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

crosscheck 2020. 11. 26. 07:53
반응형

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


질문

테스트 목적으로 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);
});

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


다음 가져 오기 사용 :

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 형식을 준수합니다.


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

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

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

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

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


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

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

import * as Rx from 'rxjs/Rx';

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

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

obs.subscribe(value => console.log('Subscriber: ' + value));

참고 URL : https://stackoverflow.com/questions/42413969/how-can-i-create-an-observable-with-a-delay

반응형