Return 一个空的 Observable

Return an empty Observable

函数 more() 应该 return 来自 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 上收到错误,我如何才能 return空 Observable?

this.collection.more().subscribe(
  (res) => {
    console.log(res);
  }, (err) => {
    console.log(err);
  }
);

是的,有一个 Empty 运算符

Rx.Observable.empty();

打字稿可以使用from:

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

你可以returnObservable.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()

对于打字稿,您可以像这样指定空可观察对象的通用参数:

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 并发出下一个值为 {} 的值,然后它完成 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

您也可以使用如下函数:

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

您可以 return 空的可观察对象有各种不同的方式,但挑战是 return 它具有预期的类型 - 这是创建类型为 -

的空可观察对象的方法
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>>();
            }));
    }

由于所有答案都已过时,我将post此处提供最新答案

在 RXJS >= 6

import { EMPTY } from 'rxjs'
return EMPTY;

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

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

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