什么';RXJS中异步主题的意义是什么?
什么';RXJS中异步主题的意义是什么?,rxjs,observable,Rxjs,Observable,RxJS的文档对AsyncSubject的定义如下: AsyncSubject是一个变体,其中只有可观察执行的最后一个值被发送给其观察者,并且只有在执行完成时 我不明白在哪里/为什么我需要使用这个主题的变体。有人能提供一个解释或真实世界的例子来说明它的存在原因及其优势吗?看起来它对于获取和缓存(一次性)资源很有用,因为通常http.get会发出一个响应,然后完成 从 它('完成时应发出最后一个值',()=>{ 它('完成后订阅时应发出最后一个值',()=>{ 它('应继续向后续订阅发送最后一个值
RxJS
的文档对AsyncSubject
的定义如下:
AsyncSubject是一个变体,其中只有可观察执行的最后一个值被发送给其观察者,并且只有在执行完成时
我不明白在哪里/为什么我需要使用这个主题的变体。有人能提供一个解释或真实世界的例子来说明它的存在原因及其优势吗?看起来它对于获取和缓存(一次性)资源很有用,因为通常http.get会发出一个响应,然后完成 从 它('完成时应发出最后一个值',()=>{
它('完成后订阅时应发出最后一个值',()=>{
它('应继续向后续订阅发送最后一个值',()=>{ 获取之后订阅的组件将获取值,而
Subject的情况并非如此
const subject=new Rx.subject();
const asyncSubject=new Rx.asyncSubject();
//提前订阅
subject.subscribe(x=>console.log('before complete-subject',x))
订阅(x=>console.log('before complete-asyncSubject',x'))
主题。下一个(“值1”);
subject.complete();
subject.next(“值2”);
asyncSubject.next('value 1');
asyncSubject.complete();
asyncSubject.next('value 2');
//认购
subject.subscribe(x=>console.log('after complete-subject',x))
asyncSubject.subscribe(x=>console.log('after complete-asyncSubject',x))
。作为控制台包装{最大高度:100%!重要;顶部:0}
酷
为了好玩,我添加了处理程序来记录完成事件,以显示在主题完成后发生订阅时,在任何情况下(主题或异步主题)都会引发这些事件
还添加了BehaviorSubject
const subject=new Rx.subject();
const asyncSubject=new Rx.asyncSubject();
const behaviorSubject=新的Rx.behaviorSubject();
log('init之前-behaviorSubject',behaviorSubject.value)
subject.next('INIT');
asyncSubject.next('INIT');
behaviorSubject.next('INIT');
log('before subscribe-behaviorSubject',behaviorSubject.value)
//提前订阅
subject.subscribe(x=>console.log('before complete-subject',x))
订阅(x=>console.log('before complete-asyncSubject',x'))
订阅(x=>console.log('before complete-behaviorSubject',x'))
subject.next(“next”);
subject.complete();
asyncSubject.next('next');
asyncSubject.complete();
behaviorSubject.next(“next”);
behaviorSubject.complete();
//认购
subject.subscribe({
下一步:x=>console.log('after complete-subject',x),
complete:()=>console.log('完成后-主题完成')
})
asyncSubject.subscribe({
下一步:x=>console.log('after complete-asyncSubject',x),
complete:()=>console.log('after complete-asyncSubject complete')
})
behaviorSubject.subscribe({
下一步:x=>console.log('after complete-behaviorSubject',x),
complete:()=>console.log('after complete-behaviorSubject complete')
})
。作为控制台包装{最大高度:100%!重要;顶部:0}
AsyncSubject
的存在是为了便于实现。也许更容易看到它的用例?我本来打算写一个关于这个问题的答案,但我写了,但是我写了。@cartant这是超越了一切的!但要想成为一个我可以接受的答案,它需要用博文wi的内容来回答精简它。还是谢谢!这些东西的名字是谁!-/有什么真实的案例场景吗?哇,回答得很好!真的有助于解释这一点。这和ReplaySubject(1)
之间的唯一区别是,ReplaySubject在完成之前不会发出任何东西。所以,如果你只需要一个值,你会使用AsyncSubject吗?(不要引用我的话!)ReplaySubject
在获得新值时发出。AsyncSubject
在看到complete
时只发出最后一个值。