programing

지연이 있는 관찰 가능 요소를 만들려면 어떻게 해야 합니까?

lovejava 2023. 2. 23. 21:57

지연이 있는 관찰 가능 요소를 만들려면 어떻게 해야 합니까?

질문.

테스트 목적으로,Observable실제 http 콜에 의해 반환되는 관찰 가능한 것을 대체하는 오브젝트Http.

My observatible은 다음 코드로 생성됩니다.

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를 종료하고 싶지 않습니다.그래서 저는 옵저버블 스트림에 대한 아이템의 출시 간격을 조금 두고 출시해야 합니다.

다음 가져오기를 사용합니다.

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

기본적으로 어레이의 모든 항목에 대해 새로운 '지연된' 관찰 가능 항목이 생성됩니다.그 밖에도 여러 가지 방법이 있을 수 있지만, 저는 이 방법이 잘 작동하여 '새로운' RXJS 포맷에 준거하고 있습니다.

RxJ 5+에서는 다음과 같이 할 수 있습니다.

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

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

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

네가 원하는 건 타이머야

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

답하기엔 조금 늦었지만... 만약을 위해 누군가 답을 찾고 있는 이 질문으로 돌아갈지도 모른다.

'delay'는 관찰 가능한 속성(함수)입니다.

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

이건 나한테 효과가 있었어...

사용할 수 있습니다.asyncScheduler는 작업을 JavaScript 이벤트루프 큐에 배치하여 비동기적으로 스케줄링합니다.작업을 시간 내에 지연하거나 반복 작업을 예약하는 데 가장 적합합니다.

매뉴얼 링크

import * as Rx from 'rxjs/Rx';

Blow code를 작동시키려면 위의 Import를 추가해야 합니다.

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