0%

rxjs 创建操作符create

创建操作符的定义

1
public static create(onSubscription: function(observer: Observer): TeardownLogic): Observable

创建一个新的Observable,当观察者(Observer)订阅该Observable时,执行指定的函数。

创建自定义的Observable,它可以做任何你想做的事。

例如,我们随便创建一个:

1
2
3
4
5
6
7
const observable = Observable.create((observer) => {
observer.next('test');
});
observable.subscribe(res => {
console.log(res);
});
// 控制台输出:test

createonSubscription函数转化为一个实际的Observable。每当有订阅该Observable时,onSubscription函数将会接受Observer实例作为唯一参数执行。onSubscription应该调用观察者对象的nexterrorcomplete方法。

  • 带值调用next会将该值发出给观察者
  • 调用complete意味着该Observable结束了发出并且不会做任何事
  • 调用error意味着出现了错误,传给error的阐述应该提供详细的错误信息

一个格式良好的Observable可以通过next方法发出任意多个的值,但是completeerror方法只能被调用一次,并且调用之后不会再调用任何方法。如果试图在Observable已经完成或发生错误之后调用nextcompleteerror方法,这些调用将会被忽略。不一定非要在某个时刻调用complete方法,创建一个不会终止的Observable也是可以的。

onSubscription可以选择性的返回一个函数或者一个拥有unsubscribe方法的对象,当要取消对Observable的订阅时,函数或方法会被调用,清理所有的资源。这样可以减少不必要的触发,节省宿主的计算能力。

绝大多数情况下你不需要使用create,因为现有操作符创建出来的Observable能满足绝大多数使用场景,这也就意味着,create是允许你创建或任何Observable的底层机制,如果有非常特殊的需求的话,可以使用它,其他情况尽量选择已存在的操作符。

因为Observable继承的类以及定义了静态create方法,但是签名不同,不可能给Observable.create合适的签名。正因为如此,给create传递的函数将不会进行类型检查。当使用TypeScript时,建议传递给create函数签名声明为(observer: Observer) => TeardownLogic,其中ObserverTeardownLogic是库提供的接口。
例如:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
 const observable = Observable.create((observer: Observer<number>): TeardownLogic => {
observer.next(1);
observer.next(2);
observer.next(3);
observer.complete();
});
observable.subscribe(
res => {
console.log(res);
},
err => {
console.log(err);
},
() => {
console.log('complete');
}
);
// 控制台输出:1,2,3,complete

创建操作符还有其他的类似ofform等,create是偏底层的创建Observable的操作符,of是轻松方便创建的操作符。一般情况下直接用of就可以满足,实在有特殊需求的话就用create

码字辛苦,打赏个咖啡☕️可好?💘