Как создать наблюдаемый с задержкой

Вопрос

Для целей тестирования я создаю объекты Observable, которые заменяют наблюдаемые, которые будут возвращены фактическим HTTP-вызовом с помощью 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);
});

Но это не работает.

Ответ 1

Используя следующий импорт:

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 (и, например, angular).

Таким образом, сценарий состоит в том, что у меня есть массив элементов для проверки с помощью 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)
    });

По сути, он создает новую "отложенную" наблюдаемость для каждого элемента в вашем массиве. Вероятно, есть много других способов сделать это, но для меня это сработало и соответствует "новому" формату RXJS.

Ответ 2

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

Ответ 3

Немного поздно ответить... но на всякий случай может кто-то вернуться к этому вопросу в поисках ответа

'delay' - свойство (функция) наблюдаемого

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

Это сработало для меня...

Ответ 4

То, что вы хотите, это таймер:

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

import * as Rx from 'rxjs/Rx';

Мы должны добавить вышеупомянутый импорт, чтобы заставить код удара работать

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

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