返回一个空的 Observable

IT技术 javascript typescript rxjs observable
2021-03-17 23:25:45

该函数more()应该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,我怎样才能返回一个空的 Observable?

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

更新

在 RXJS 6

import { EMPTY } from 'rxjs'
return EMPTY; 
6个回答

对于typescript,您可以像这样指定空 observable 的通用参数:

import 'rxjs/add/observable/empty' 

Observable.empty<Response>();
现在应该是import "EmptyObservable" from "rxjs/observable/EmptyObservable";这样了new EmptyObservable<Response>();
2021-04-27 23:25:45

使用 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({})创建 anObservable并发出值为 的 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();
@SimplGy 是的,你是对的,我不喜欢使用take(1)删除以获得更好的答案。@MatthijsWessels,是与否,现在刚刚测试了这个,如果你这样做of()将返回一个完整的可观察对象而不发射next
2021-04-16 23:25:45
2021-04-24 23:25:45
empty 现在已弃用,请改用 EMPTY(用作常量而不是方法,请参阅 Simon_Weaver 的回答)。
2021-04-30 23:25:45
of('foo')确实发出并立即完成可观察。rxviz.com/v/0oqMVW1o
2021-05-15 23:25:45
请记住,of() 不会发出任何值。如果你想要一个,你应该提供任何值,即使是 undefined 或 null 也可以: of(null) 发出值(并使用 tap/subscribe 方法处理),而 of() 不会。
2021-05-15 23:25:45

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() 不存在了。

使用 Angular 时要小心,因为import { EMPTY } from "@angular/core/src/render3/definition";这也完全不是你想要的。因此,如果您遇到奇怪的错误,请确保您没有错误地导入它。
2021-04-22 23:25:45
如果您已经遇到了诸如empty()函数之类的冲突,您可以先说import { empty as rxEmpty }import { empty as _empty }然后再做rxEmpty()_empty()当然,这是一件非常不标准的事情,我实际上并不是推荐它,但我确信我不是唯一一个对 RxJS 认为它值得将像ofempty导入到我的命名空间中的函数感到惊讶的人
2021-05-06 23:25:45
小心与EMPTY的关系.subscribe()例如,EMPTY.subscribe(() => {console.log('test');})可能不会做您认为它会做的事情。更多信息在这里blog.novanet.no/rxjs-getting-fooled-by-empty-observables
2021-05-09 23:25:45
2021-05-10 23:25:45
Observable.empty()实际上仍然存在,但它已被弃用以支持EMPTY.
2021-05-13 23:25:45

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

import {EmptyObservable} from 'rxjs/observable/EmptyObservable';
...
return new EmptyObservable();
...
包括它 import {EmptyObservable} from 'rxjs/observable/EmptyObservable';
2021-04-18 23:25:45
出现这样的错误,我需要在 system-config 中配置任何东西吗?未处理的Promise拒绝:(SystemJS)XHR 错误(404 未找到)加载localhost:9190/node_modules/rxjs/Observable/EmptyObservable.js 错误:XHR 错误(404 未找到)加载localhost:9190/node_modules/rxjs/Observable/EmptyObservable。 js
2021-05-10 23:25:45

创建 Empty Observable 的几种方法:

它们只是在您将如何进一步使用它(它将在:nextcomplete之后发出什么事件)上有所不同do nothing例如:

  • Observable.never() - 不发出任何事件并且永不结束。
  • Observable.empty()- 只发出complete.
  • Observable.of({})- 发出nextcomplete(作为示例传递的空对象文字)。

根据您的确切需求使用它)