À des fins de test, je crée des objets Observable
qui remplacent l'observable renvoyé par un appel http réel avec Http
.
Mon observable est créé avec le code suivant:
fakeObservable = Observable.create(obs => {
obs.next([1, 2, 3]);
obs.complete();
});
Le fait est que cet observable émet immédiatement. Existe-t-il un moyen d'ajouter un délai personnalisé à son émission?
J'ai essayé ceci:
fakeObservable = Observable.create(obs => {
setTimeout(() => {
obs.next([1, 2, 3]);
obs.complete();
}, 100);
});
Mais cela ne semble pas fonctionner.
En utilisant les importations suivantes:
import {Observable} from 'rxjs/Observable';
import 'rxjs/add/observable/of';
import 'rxjs/add/operator/delay';
Essaye ça:
let fakeResponse = [1,2,3];
let delayedObservable = Observable.of(fakeResponse).delay(5000);
delayedObservable.subscribe(data => console.log(data));
MISE À JOUR: RXJS 6
La solution ci-dessus ne fonctionne plus vraiment dans les versions plus récentes de RXJS (et de angular par exemple).
Le scénario est donc que j'ai un tableau d'éléments à vérifier avec une API. L'API n'accepte qu'un seul élément et je ne veux pas la tuer en envoyant toutes les demandes en même temps. J'ai donc besoin d'une publication ponctuelle des éléments du flux Observable avec un léger délai entre les deux.
Utilisez les importations suivantes:
import { from, of } from 'rxjs';
import { delay } from 'rxjs/internal/operators';
import { concatMap } from 'rxjs/internal/operators';
Ensuite, utilisez le code suivant:
const myArray = [1,2,3,4];
from(myArray).pipe(
concatMap( item => of(item).pipe ( delay( 1000 ) ))
).subscribe ( timedItem => {
console.log(timedItem)
});
Cela crée fondamentalement un nouvel observable 'retardé' pour chaque élément de votre tableau. Il y a probablement beaucoup d'autres façons de le faire, mais cela a bien fonctionné pour moi et est conforme au "nouveau" format RXJS.
Dans RxJS 5+, vous pouvez le faire comme ceci
import { Observable } from "rxjs/Observable";
import { of } from "rxjs/observable/of";
import { delay } from "rxjs/operators";
fakeObservable = of('dummy').pipe(delay(5000));
Dans RxJS 6+
import { of } from "rxjs";
import { delay } from "rxjs/operators";
fakeObservable = of('dummy').pipe(delay(5000));
Il est un peu tard pour répondre ... mais juste au cas où quelqu'un reviendrait sur cette question à la recherche d'une réponse
'delay' est la propriété (fonction) d'un observable
fakeObservable = Observable.create(obs => {
obs.next([1, 2, 3]);
obs.complete();
}).delay(3000);
Cela a fonctionné pour moi ...
Ce que vous voulez, c'est une minuterie:
// 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));