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
})
)
答案 0 :(得分:1)
Observable.create()
和 new Observable()
本质上是做同样的事情。
From Anatomy of an Observable:
Rx.Observable.create
是Observable
constructor
的别名,它有一个参数:subscribe
函数。
Observable.of
,另一方面是static
上的Observable
方法。它会为您创建一个Observable
,它会立即一个接一个地发出您指定为自变量的值,然后发出完整的通知。
问题与您的实施有关:
您对Custom Observable的实现是错误的。 new
上的Observable时,必须将subscribe
函数传递给其constructor
,该函数以observer
作为参数。 observer
上具有诸如next
,error
和complete
之类的方法,它们在该可观察的生命周期中的特定实例处被调用。
您还应该公开一个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.of
或Observable.from
就可以了。