Last active
April 29, 2019 03:54
-
-
Save new08/c2403ca8e91234af2a4feb922711045d to your computer and use it in GitHub Desktop.
RxJS
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// 在订阅 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!" | |
*/ |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// 直接订阅 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!" | |
*/ |
subject 有三种变体
- BehaviorSubject 跟 Subject 最大的不同就是 BehaviorSubject 是用來呈現當前的值,而不是單純的發送事件。BehaviorSubject 會記住最新一次發送的元素,並把該元素當作目前的值
- ReplaySubject 某些時候我們會希望 Subject 代表事件,但又能在新訂閱時重新發送最後的幾個元素
- AsyncSubject 是最怪的一個變形,他有點像是 operator last,會在 subject 結束後送出最後一個值
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
總結成兩句話
Subject 同時是 Observable 又是 Observer
Subject 會對內部的 observers 清單進行組播(multicast)