Как я могу создать заметное с задержкой

Вопрос

Для тестирования я создаю Observable объекты, которые заменяют заметное, которое было бы возвращено фактическим вызовом http с Http.

Мое заметное создается со следующим кодом:

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

Вещь, это заметное испускает immediatly. Существует ли способ добавить пользовательскую задержку с ее эмиссией?


Дорожка

Я попробовал это:

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

Но это, кажется, не работает.

62
задан 23 February 2017 в 19:57

5 ответов

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

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.

115
ответ дан 31 October 2019 в 13:11

В 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));
63
ответ дан 31 October 2019 в 13:11

Это мало поздно для ответа..., но на всякий случай может быть кем-то, возвращаются к этому вопросу, ища ответ

, 'задержка' является свойством (функция) Заметного

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

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

8
ответ дан 31 October 2019 в 13:11

То, что Вы хотите, является таймером:

// 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));
7
ответ дан 31 October 2019 в 13:11

import * as Rx from 'rxjs/Rx';

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

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

obs.subscribe(value => console.log('Subscriber: ' + value));
-2
ответ дан 31 October 2019 в 13:11

Другие вопросы по тегам:

Похожие вопросы: