rxjs中的new observable和of有什么区别

时间:2018-09-20 17:48:51

标签: angular rxjs rxjs6

new Observable()中的of()RxJs有什么区别?

在我的测试用例中,当我尝试返回new Observable()时,会出现有线错误;如果我用Rxjs中的of()替换它,它会很好地工作。

我的印象是Observable.create()new Observable()of()做同样的事情。

someService.getMethod().pipe(
  ...
  catchError((e) => {
    // some operation
    // return new Observable(false as any);  // ----> creates error
    return of(false as any); // this works perfectly
  })
)

1 个答案:

答案 0 :(得分:1)

Observable.create() new Observable() 本质上是做同样的事情。

  

From Anatomy of an Observable

     

Rx.Observable.createObservable constructor的别名,它有一个参数:subscribe函数。

Observable.of ,另一方面是static上的Observable方法。它会为您创建一个Observable,它会立即一个接一个地发出您指定为自变量的值,然后发出完整的通知。

问题与您的实施有关:

您对Custom Observable的实现是错误的。 new上的Observable时,必须将subscribe函数传递给其constructor,该函数以observer作为参数。 observer上具有诸如nexterrorcomplete之类的方法,它们在该可观察的生命周期中的特定实例处被调用。

您还应该公开一个Subscription对象,该对象上具有一个unsubscribe方法,供消费者使用,然后可以进行任何清理。

以下是一般的实现方式:

const yourCustomObservable = new Observable((observer) => {
  observer.next("This pushes new value to the consumer");
  observer.error("This pushes an error to the consumer");
  observer.complete();

  return function unsubscribe() {
    // When the consumer unsubscribes, clean up data ready for next subscription.
  };
});

对于您的特定用例,您可以使用:

new Observable(...)

import { Observable } from 'rxjs';
...
someService.getMethod().pipe(
  ...
  catchError((e) => {
    // some operation
    return new Observable(observer => observer.next(false));
  })
)

Observable.create

import { Observable } from 'rxjs';
...
someService.getMethod().pipe(
  ...
  catchError((e) => {
    // some operation
    return Observable.create(observer => observer.next(false));
  })
)

of

import { of } from 'rxjs';
...
someService.getMethod().pipe(
  ...
  catchError((e) => {
    // some operation
    return of(false);
  })
)

from

import { from } from 'rxjs';
...
someService.getMethod().pipe(
  ...
  catchError((e) => {
    // some operation
    return from([false]);
  })
)

看看这个Sample StackBlitz供参考。

何时使用什么?

new Observable(...)Observable.create(...)为您提供了更精细的控制,您可以在其中定义自己的subscribe函数并在其中执行任何操作。因此,您可能希望使用它来实现通常无法使用static上提供的Observable方法创建的自定义Observable。但是,对于像您这样的简单用例,只需使用Observable.ofObservable.from就可以了。