La fonction more()
est supposée renvoyer une Observable
à partir d'une requête get
export class Collection{
public more = (): Observable<Response> => {
if (this.hasMore()) {
return this.fetch();
}
else{
// return empty observable
}
}
private fetch = (): Observable<Response> => {
return this.http.get('some-url').map(
(res) => {
return res.json();
}
);
}
}
Dans ce cas, je ne peux faire une demande que si hasMore()
est vrai, sinon je reçois une erreur sur subscribe()
fonction subscribe is not defined
, comment puis-je retourner un observable vide?
this.collection.more().subscribe(
(res) =>{
console.log(res);
},
(err) =>{
console.log(err);
}
)
Dans RXJS 6
import { EMPTY } from 'rxjs'
return EMPTY;
Pour TypeScript, vous pouvez spécifier un paramètre générique de votre observable vide comme ceci:
import 'rxjs/add/observable/empty'
Observable.empty<Response>();
Avec la nouvelle syntaxe, par exemple Rxjs 5.5+, cela devient comme suit:
// rxjs 6
import { empty, of } from "rxjs";
// rxjs 5.5+ (<6)
import { empty } from "rxjs/observable/empty";
import { of } from "rxjs/observable/of";
empty();
of({});
Une chose à garder à l'esprit, empty()
complète l'observable, de sorte qu'il ne déclenche pas next
dans votre flux, mais le complète! Ainsi, si vous avez par exemple tap
, ils ne seront peut-être pas déclenchés comme vous le souhaitez (voir l'exemple ci-dessous).
alors que of({})
crée un observable et émet ensuite avec une valeur de {}
, il ne complétera pas l'observable seul. Peut-être devriez-vous faire of({}).pipe(take(1))
pour émettre et compléter.
par exemple.
empty().pipe(
tap(() => console.warn("i will not reach here, as i am complete"))
).subscribe();
of({}).pipe(
tap(() => console.warn("i will reach here and complete"))
).subscribe();
Dans mon cas avec Angular2 et rxjs, cela fonctionnait avec:
import {EmptyObservable} from 'rxjs/observable/EmptyObservable';
...
return new EmptyObservable();
...
Oui, il y a un vide opérateur
Rx.Observable.empty();
Pour TypeScript, vous pouvez utiliser from
:
Rx.Observable<Response>.from([])
Il existe maintenant une constante EMPTY
et une fonction empty
.
import { Observable, empty, of } from 'rxjs';
var delay = empty().pipe(delay(1000));
var delay2 = EMPTY.pipe(delay(1000));
Observable.empty()
n'existe plus.
Plusieurs façons de créer un observable vide:
Ils diffèrent simplement par la manière dont vous allez l'utiliser (quels événements seront émis après: next
, complete
ou do nothing
), par exemple:
Observable.never()
- n'émet aucun événement et ne se termine jamais.Observable.empty()
- n'émet quecomplete
.Observable.of({})
- émet deuxnext
etcomplete
(littéral d'objet vide transmis à titre d'exemple).Utilisez-le sur vos besoins exacts)
Vous pouvez retourner Observable.of (empty_variable), par exemple
Observable.of('');
// or
Observable.of({});
// etc
Ou vous pouvez aussi essayer ignoreElements()
RxJS 6
vous pouvez également utiliser les fonctions suivantes:
return from<string>([""]);
après importation:
import {from} from 'rxjs';
Essaye ça
export class Collection{
public more (): Observable<Response> {
if (this.hasMore()) {
return this.fetch();
}
else{
return this.returnEmpty();
}
}
public returnEmpty(): any {
let subscription = source.subscribe(
function (x) {
console.log('Next: %s', x);
},
function (err) {
console.log('Error: %s', err);
},
function () {
console.log('Completed');
});
}
}
let source = Observable.empty();
Venu ici avec une question similaire, ce qui précède n'a pas fonctionné pour moi dans: "rxjs": "^6.0.0"
, afin de générer un observable n'émettant aucune donnée que je devais faire:
import {Observable,empty} from 'rxjs';
class ActivatedRouteStub {
params: Observable<any> = empty();
}