Функция 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()
имеет значение true, иначе я получаю сообщение об ошибке, что функция subscribe is not defined
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;
Для машинописного текста вы можете указать общий параметр вашей пустой наблюдаемой, например:
import 'rxjs/add/observable/empty'
Observable.empty<Response>();
С новым синтаксисом, например, 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({})
создает наблюдаемый объект и генерирует следующий со значением {}
, он не завершит только наблюдаемое, возможно, вы должны выполнить of({}).pipe(take(1))
для генерации и завершения.
например
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();
of('foo')
немедленно испускает и завершает наблюдаемое. rxviz.com/v/0oqMVW1o
В моем случае с Angular2 и rxjs он работал с:
import {EmptyObservable} from 'rxjs/observable/EmptyObservable';
...
return new EmptyObservable();
...
import {EmptyObservable} from 'rxjs/observable/EmptyObservable';
Да, есть Empty оператор
Rx.Observable.empty();
Для typescript вы можете использовать from
:
Rx.Observable<Response>.from([])
Rx.Observable<{}>
не может быть назначен для Observable<Response>
, я пытался Rx.Observable<Response>.empty()
но это не сработало
Там теперь EMPTY
константа и empty
функция.
import { Observable, empty, of } from 'rxjs';
var delay = empty().pipe(delay(1000));
var delay2 = EMPTY.pipe(delay(1000));
Observable.empty()
больше не существует.
empty()
вы можете сказать import { empty as rxEmpty }
или import { empty as _empty }
а затем выполнить rxEmpty()
или _empty()
. Конечно, это довольно нестандартная вещь, и я на самом деле не рекомендую ее, но я уверен, что я не единственная, кто был удивлен, RxJS считает, что она достойна импорта таких функций, как of
и empty
в мое пространство имен!
Несколько способов создать Пустую Наблюдаемую:
Они просто отличаются тем, как вы собираетесь использовать его дальше (какие события он будет генерировать после: next
, complete
или do nothing
), например:
Observable.never()
- не генерирует никаких событий и никогда не заканчивается.Observable.empty()
- выбрасывает только complete
.Observable.of({})
- испускает и next
и complete
(в качестве примера передан пустой литерал объекта).Используйте его на свои нужды)
Вы можете вернуть Observable.of(empty_variable), например
Observable.of('');
// or
Observable.of({});
// etc
Или вы можете попробовать ignoreElements()
, а также
Пришел сюда с похожим вопросом, вышеупомянутое не работало для меня в: "rxjs": "^6.0.0"
, чтобы сгенерировать наблюдаемую информацию, которая не выдает данных, которые мне нужно было сделать:
import {Observable,empty} from 'rxjs';
class ActivatedRouteStub {
params: Observable<any> = empty();
}
RxJS 6
Вы можете использовать также из функции, как показано ниже:
return from<string>([""]);
после импорта:
import {from} from 'rxjs';
Попробуйте это
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();
import "EmptyObservable" from "rxjs/observable/EmptyObservable";
, затемnew EmptyObservable<Response>();
,