web-dev-qa-db-ja.com

遅れて観測量を作成する方法

質問

テスト目的で、実際の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);
});

しかし、うまくいかないようです。

54
Adrien Brunelat

以下のインポートを使用します。

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

それは基本的にあなたの配列内のすべてのアイテムに対して新しい '遅延'オブザーバブルを作成します。他にも多くの方法があるでしょうが、これは私にとってはうまくいき、 'new' RXJSフォーマットに準拠しています。

101
MikeOne

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));
46
Adrian Ber

ちょっと答えるのが遅れています...しかし念のため誰かが答えを探してこの質問に戻るかもしれません

'遅延'は、観測量の特性(機能)です。

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

これは私のために働きました...

8
microchip78

欲しいのはタイマーです。

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