Как вернуть пустое наблюдаемое в rxjs
функции more()
получилось Observable
из запроса 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();
}
);
}
}
в данном случае я могу только сделать запрос, если hasMore()
Это правда, иначе я получаю ошибку на subscribe()
функции subscribe is not defined
, как я могу вернуть пустой заметный?
this.collection.more().subscribe(
(res) =>{
console.log(res);
},
(err) =>{
console.log(err);
}
)
обновление
в RXJS 6
import { EMPTY } from 'rxjs'
return EMPTY;
11 ответов:
для typescript вы можете указать общий параметр вашего пустого наблюдаемого следующим образом:
import 'rxjs/add/observable/empty' Observable.empty<Response>();
в моем случае с Angular2 и rxjs, он работал с:
import {EmptyObservable} from 'rxjs/observable/EmptyObservable'; ... return new EmptyObservable(); ...
Да, есть am пустой оператор
Rx.Observable.empty();
для typescript, вы можете использовать
from
:Rx.Observable<Response>.from([])
С новым синтаксисом, например, rxjs 5.5+, это становится следующим:
// 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({});
только одна вещь, чтобы иметь в виду,
empty()
завершает наблюдаемое, поэтому он не будет запускатьnext
в вашем потоке, только завершает! Так что если у вас естьtap
например, они не могут сделать триггер, как вы хотите (см. пример ниже)., тогда как
of({})
создает наблюдаемый и выдает next со значением{}
, это не будет завершить наблюдаемое в одиночку, возможно, вы должны сделатьof({}).pipe(take(1))
to испускают и завершают.например
empty().pipe( tap(() => console.warn("i will not reach here, as i am complete")) ).subscribe(); of({}).pipe( take(1), tap(() => console.warn("i will reach here")) ).subscribe();
вы можете вернуть Observable.of(empty_variable), например
Observable.of(''); // or Observable.of({}); // etc
несколько способов создать пустой наблюдаемый:
они просто отличаются от того, как вы собираетесь использовать его в дальнейшем (какие события он будет излучать после:
next
,complete
илиdo nothing
) например:
Observable.never()
- не испускает никаких событий и никогда не заканчивается.Observable.empty()
- выдает толькоcomplete
.Observable.of({})
- излучает какnext
иcomplete
(пустой литерал объекта, переданного в качестве примера).использовать его на ваших точных потребностей)
попробуй такое
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();