Вопрос
В целях тестирования я создаю 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);
});
Но похоже, что это не работает.
angular
typescript
observable
Адриен Брунелат
источник
источник
.create(...)
с ,.delay(1000)
но это не работа:. Observable_1.Observable.create (...) задержка не является функцией.Ответы:
Используя следующий импорт:
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) });
По сути, он создает новый «отложенный» Observable для каждого элемента в вашем массиве. Вероятно, есть много других способов сделать это, но это сработало для меня и соответствует «новому» формату RXJS.
источник
import {Observable} from 'rxjs/Observable';
?import 'rxjs/add/observable/of';
. Вы случайно делаете то же самое? Это все еще странно, так как он не связывается с .delay (...), и он показывает ошибку, когда я пытаюсьrxjs/add/observable/delay
...of(item.pipe ( delay( 1000 ) ))
передатьof(item))).pipe(delay(1000)
массив дал мне ошибкиВ 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));
Если вы хотите отложить каждое испускаемое значение, попробуйте
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));
источник
Немного поздно отвечать ... но на всякий случай может кто-нибудь вернется к этому вопросу в поисках ответа
«задержка» - это свойство (функция) наблюдаемого
fakeObservable = Observable.create(obs => { obs.next([1, 2, 3]); obs.complete(); }).delay(3000);
Это сработало для меня ...
источник
import 'rxjs/add/operator/delay'
теперь выдает эту ошибку: Модуль не найден: Ошибка: не удается разрешить 'rxjs / add / operator / delay'import * as Rx from 'rxjs/Rx';
Мы должны добавить указанный выше импорт, чтобы код удара работал
Let obs = Rx.Observable .interval(1000).take(3); obs.subscribe(value => console.log('Subscriber: ' + value));
источник