Skip to content

Instantly share code, notes, and snippets.

@new08
Last active April 29, 2019 03:54
Show Gist options
  • Save new08/c2403ca8e91234af2a4feb922711045d to your computer and use it in GitHub Desktop.
Save new08/c2403ca8e91234af2a4feb922711045d to your computer and use it in GitHub Desktop.
RxJS
// 在订阅 subject 时,已经执行过的 subject.next() 是不会接收到的。
// 如果希望接收到之前的事件,可以使用 subject 的变体 ——
// AsyncSubject 会在 subject 结束后送出最后一次的值。
var source = Rx.Observable.create(function(observer) {
setTimeout(function() {
console.log('posting');
observer.next('success');
observer.complete();
},1000)
});
var subject = new Rx.AsyncSubject();
var observerA = {
next: value => console.log('A next: ' + value),
error: error => console.log('A error: ' + error),
complete: () => console.log('A complete!')
}
var observerB = {
next: value => console.log('B next: ' + value),
error: error => console.log('B error: ' + error),
complete: () => console.log('B complete!')
}
subject.subscribe(observerA);
source.subscribe(subject);
setTimeout(() => {
subject.subscribe(observerB);
},3000)
/* >>>
"posting"
"A next: success"
"B next: success"
"A complete!"
"B complete!"
*/
// 直接订阅 observer 时,每个 observer 都是分开执行的。
// 如果不希望 observer 重复执行,可以通过 subject 订阅 observer,
// 这种也称为组播(multicast)
var source = Rx.Observable.create(function(observer) {
setTimeout(function() {
console.log('posting');
observer.next('success');
observer.complete();
},1000)
});
var observerA = {
next: value => console.log('A next: ' + value),
error: error => console.log('A error: ' + error),
complete: () => console.log('A complete!')
}
var observerB = {
next: value => console.log('B next: ' + value),
error: error => console.log('B error: ' + error),
complete: () => console.log('B complete!')
}
console.log('starting');
var subject = new Rx.Subject()
subject.subscribe(observerA)
subject.subscribe(observerB);
source.subscribe(subject);
/* >>>
"starting"
"posting"
"A next: success"
"B next: success"
"A complete!"
"B complete!"
*/
@new08
Copy link
Author

new08 commented Apr 29, 2019

總結成兩句話

Subject 同時是 Observable 又是 Observer
Subject 會對內部的 observers 清單進行組播(multicast)

@new08
Copy link
Author

new08 commented Apr 29, 2019

@new08
Copy link
Author

new08 commented Apr 29, 2019

subject 有三种变体

  • BehaviorSubject 跟 Subject 最大的不同就是 BehaviorSubject 是用來呈現當前的值,而不是單純的發送事件。BehaviorSubject 會記住最新一次發送的元素,並把該元素當作目前的值
  • ReplaySubject 某些時候我們會希望 Subject 代表事件,但又能在新訂閱時重新發送最後的幾個元素
  • AsyncSubject 是最怪的一個變形,他有點像是 operator last,會在 subject 結束後送出最後一個值

Subject, BehaviorSubject, ReplaySubject, AsyncSubject

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment