最近对 RXJS
中的 Observable
和 Subject
有了更多的了解,特在此记录。
1. Pull vs Push
Producer(生产者) | Consumer(消费者) | |
---|---|---|
Pull(下拉) | 在被请求时才生成数据 | 决定何时请求数据 |
Push(上交) | 以自己的节奏生成数据 | 对接收到的数据做出响应 |
在 pull
系统中, 消费者 决定何时从数据 生产者 中接收数据,生产者本身不知道数据何时会被传递给消费者,调用函数就是一个典型的 pull 系统,函数本身不知道何时会被调用,只有调用函数的人才知道。
而在 push
系统中, 生产者 决定何时将数据发送给 消费者, 消费者不知道何时接收数据, Observable 就是一个典型的 push 系统。
2. Observable
Observable 类似于无参数的函数,但是可以输出多个值。
Function
function foo() {
console.log('Hello');
return 42;
}
var x = foo.call(); // 等同于 foo()
console.log(x);
var y = foo.call(); // 等同于 foo()
console.log(y);
输出:
"Hello"
42
"Hello"
42
Observable
var foo = Rx.Observable.create(function (observer) {
console.log('Hello');
observer.next(42);
});
foo.subscribe(function (x) {
console.log(x);
});
foo.subscribe(function (y) {
console.log(y);
});
输出:
"Hello"
42
"Hello"
42
上面是相同之处,接下来说一下不同之处。
Observable 能够同步或异步传递值, 而 Function 只能同步传递。
Function
function foo() {
console.log('Hello');
return 42;
return 100; // 永远不会传递出去
}
Observable
var foo = Rx.Observable.create(function (observer) {
console.log('Hello');
observer.next(42);
observer.next(100);
observer.next(200);
setTimeout(() => {
observer.next(300); // happens asynchronously
}, 1000);
});
console.log('before');
foo.subscribe(function (x) {
console.log(x);
});
console.log('after');
输出:
"before"
"Hello"
42
100
200
"after"
300
总结: Function 只能 同步 的 return 单值, 而 Observable 既可以 同步,也可以 异步 的 return 单值 或者 多值。
3. Subject
Subject 是可以 多播 值的Observable。
例如:
Observable
let obs = Observable.create(observer=>{
observer.next(Math.random());
})
obs.subscribe(res=>{
console.log('subscription a :', res); //subscription a :0.2859800202682865
});
obs.subscribe(res=>{
console.log('subscription b :', res); //subscription b :0.694302021731573
});
Subject
let obs = new Subject();
obs.subscribe(res=>{
console.log('subscription a :', res); // subscription a : 0.91767565496093
});
obs.subscribe(res=>{
console.log('subscription b :', res); // subscription b : 0.91767565496093
});
obs.next(Math.random());
从例子中可以看出, Observable 的订阅结果各 不相同,而 Subject 的订阅结果却是 相同 的,这就是把一个值 多播 到订阅者中。
还可以看到 subject 中的观察者 obs 既可以作为 消费者,也能作为 生产者,而 Observable 中的观察者 obs 只能作为 生产者。
文章参考自:RXJS, Stack Overflow
网友评论