返回一个空的Observable

函数more()应该从get请求返回Observable

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);
}
);
251205 次浏览

是的,有一个操作符

Rx.Observable.empty();

对于typescript,你可以使用from:

Rx.Observable<Response>.from([])

例如,您可以返回Observable.of(empty_variable)

Observable.of('');


// or
Observable.of({});


// etc

试试这个

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();

或者你也可以试试ignoreElements()

对于typescript,你可以像这样指定空可观察对象的泛型参数:

import 'rxjs/add/observable/empty'


Observable.empty<Response>();

在我使用Angular2和rxjs的情况下,它与:

import {EmptyObservable} from 'rxjs/observable/EmptyObservable';
...
return new EmptyObservable();
...

使用RxJS 5.5+的新语法,它变成如下所示:

// RxJS 6
import { EMPTY, empty, of } from "rxjs";


// rxjs 5.5+ (<6)
import { empty } from "rxjs/observable/empty";
import { of } from "rxjs/observable/of";


empty(); // deprecated use EMPTY
EMPTY;
of({});

只有一件事要记住,EMPTY完成了可观察对象,所以它不会在你的流中触发next,而只是完成。因此,如果你有,例如,tap,他们可能不会像你希望的那样被触发(见下面的例子)。

of({})创建了一个Observable,并生成了一个值为{}的next,然后它完成了Observable

例如:

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();

RxJS6(未安装兼容包)

现在有一个EMPTY常量和一个empty函数。

  import { Observable, empty, EMPTY, of } from 'rxjs';


//This is now deprecated
var delay = empty().pipe(delay(1000));
var delay2 = EMPTY.pipe(delay(1000));

Observable.empty()不再存在。

RxJS 6

你可以像下面这样使用also from函数:

return from<string>([""]);

导入后:

import {from} from 'rxjs';

创建Empty Observable的几种方法:

它们只是在你将如何进一步使用它(它将在:nextcompletedo nothing之后发出什么事件)方面有所不同,例如:

  • Observable.never() -不触发事件且永不结束。
  • Observable.empty() -只发射complete
  • Observable.of({}) -同时发出nextcomplete(空对象文字作为一个例子传递)。

用它来满足你的确切需求)

带着一个类似的问题来到这里,上面的方法在:"rxjs": "^6.0.0"中对我不起作用,为了生成一个不释放我需要做的数据的可观察对象:

import {Observable,empty} from 'rxjs';
class ActivatedRouteStub {
params: Observable<any> = empty();
}
你可以用各种不同的方式返回空的可观察对象,但挑战是用预期的类型返回它 下面是创建一个类型为-

的空观察对象的方法
intercept(req: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> {
    

return next.handle(this.setHeaders(req))
.pipe(
catchError((error: HttpErrorResponse) => {
// you write your logic and return empty response if required
return new Observable<HttpEvent<any>>();
}));
}

因为所有的答案都过时了,我将在这里发布最新的答案

在RXJS >= 6

import { EMPTY } from 'rxjs'
return EMPTY;

返回空可观察对象的不同方法:

  1. Observable.from ({});
  2. Observable.of ({});

https://www.learnrxjs.io/learn-rxjs/operators/creation/empty

还有一个:EMPTY const

替换为EMPTY常量或scheduled(例如scheduled([], scheduler))。将在v8中删除。(得到这个表单phpstorm提示)