Die Funktion more()
soll eine Observable
von einer Get-Anfrage zurückgeben
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();
}
);
}
}
In diesem Fall kann ich nur eine Anfrage machen, wenn hasMore()
wahr ist, ansonsten bekomme ich einen Fehler in subscribe()
function subscribe is not defined
. Wie kann ich ein leeres Observable zurücksenden?
this.collection.more().subscribe(
(res) =>{
console.log(res);
},
(err) =>{
console.log(err);
}
)
In RXJS 6
import { EMPTY } from 'rxjs'
return EMPTY;
Für TypeScript können Sie generische Parameter Ihres leeren Observable wie folgt angeben:
import 'rxjs/add/observable/empty'
Observable.empty<Response>();
Mit der neuen Syntax z. rxjs 5.5+ wird dies wie folgt:
// 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({});
Nur eine Sache, die Sie beachten sollten: empty()
vervollständigt das Beobachtbare, sodass es next
in Ihrem Stream nicht auslöst, es wird nur abgeschlossen! Wenn Sie beispielsweise tap
haben, werden sie möglicherweise nicht so ausgelöst, wie Sie möchten (siehe Beispiel unten).
während of({})
ein Observable erstellt und als Nächstes mit einem Wert von {}
ausstrahlt, wird das Observable nicht alleine abgeschlossen. Vielleicht sollten Sie of({}).pipe(take(1))
tun, um zu emittieren und abzuschließen.
z.B.
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();
In meinem Fall mit Angular2 und RXJS funktionierte es mit:
import {EmptyObservable} from 'rxjs/observable/EmptyObservable';
...
return new EmptyObservable();
...
Ja, es gibt einen _ Empty Operator
Rx.Observable.empty();
Für TypeScript können Sie from
verwenden:
Rx.Observable<Response>.from([])
Es gibt jetzt eine EMPTY
-Konstante und eine empty
-Funktion.
import { Observable, empty, of } from 'rxjs';
var delay = empty().pipe(delay(1000));
var delay2 = EMPTY.pipe(delay(1000));
Observable.empty()
existiert nicht mehr.
Mehrere Möglichkeiten, ein leeres Observable zu erstellen:
Sie unterscheiden sich lediglich darin, wie Sie sie weiter verwenden werden (nach welchen Ereignissen sie ausgegeben wird: next
, complete
oder do nothing
), z.
Observable.never()
- gibt keine Ereignisse aus und endet nie.Observable.empty()
- gibt nurcomplete
aus.Observable.of({})
- gibt beidenext
undcomplete
aus (Leeres Objektliteral, das als Beispiel übergeben wurde).Verwenden Sie es genau nach Ihren Bedürfnissen)
Sie können beispielsweise Observable.of (empty_variable) zurückgeben
Observable.of('');
// or
Observable.of({});
// etc
Oder Sie können auch ignoreElements()
ausprobieren
RxJS 6
sie können auch die folgende Funktion verwenden:
return from<string>([""]);
nach dem import:
import {from} from 'rxjs';
Versuche dies
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();
Kam hier mit einer ähnlichen Frage, das Obige funktionierte für mich nicht in: "rxjs": "^6.0.0"
, um ein Observable zu generieren, das keine Daten aussendet, die ich machen musste:
import {Observable,empty} from 'rxjs';
class ActivatedRouteStub {
params: Observable<any> = empty();
}