Javascript RXJS。惰性可观测

Javascript RXJS。惰性可观测,javascript,rxjs,reactive-programming,Javascript,Rxjs,Reactive Programming,我在玩弄rxjs试图理解一个概念:被动编程应该是懒惰的。如果没有一个订户连接到一个可观察对象,那么它不应该产生值。以下是我的例子: const Rx=require('rxjs') const state=new Rx.Subject() const changeStateLazy=(args)=> Rx.可观测的(args) //一些逻辑,例如REST请求 .do(val=>state.next('newstate')) changeStateLazy(42) const stateListe

我在玩弄
rxjs
试图理解一个概念:被动编程应该是懒惰的。如果没有一个订户连接到一个可观察对象,那么它不应该产生值。以下是我的例子:

const Rx=require('rxjs')
const state=new Rx.Subject()
const changeStateLazy=(args)=>
Rx.可观测的(args)
//一些逻辑,例如REST请求
.do(val=>state.next('newstate'))
changeStateLazy(42)
const stateListener=state.subscribe(
val=>console.log('state.next:',val),
err=>console.log('state.error:',err),
()=>console.log('state.complete'))

如何使可观察(在函数
changeStateLazy
中)变为懒惰,即运行
某些逻辑…
并仅在侦听器连接到
state
主题时才更改状态(在我的情况下,它是
statestener
)?

不确定您想要实现什么,但如果希望在订阅观察者时输出最后一个值,请尝试“AsyncSubject”

要使AsyncSubject工作,它需要调用complete方法

const changeState = () =>
    Rx.Observable.of(1)
       .subscribe(val => {
          state.next('new state');
          state.complete();
        });

如果希望它的行为有所不同,您可能需要使用“BehaviorSubject”、“BehaviorSubject”等。

以下是我可以处理的方法

const Rx = require('rxjs')

const lazyStateModifier = new Rx.ReplaySubject(1)
    .map(args => {
        console.log('>some logic. args: ', args)
        return {status: 'OK', result: 'new state'}
    })
    .map(res => res.result)

const state = new Rx.Subject().merge(lazyStateModifier)

const changeStateLazy = (args) =>
    lazyStateModifier.next(args)

console.log('>invoke changeStateLazy')
changeStateLazy(42)

console.log('>subscribe')
state.subscribe(
    val => console.log('state.next: ', val),
    err => console.log('state.error: ', err),
    () => console.log('state.complete'))

希望有一个更好的解决方案,而不是将每个懒惰的可观察对象合并到状态…

为什么需要这样做?你想解决什么问题?@cartant没有问题,只是学习rx,无法完成惰性状态更改如果你想对(un)订阅采取行动或得到通知,你可以将其包装在另一个可观察对象中:
observate.create(observator=>{/*observator subscribed*/const subscription=subject.subscribe(observe);return()=>{/*observer unsubscribed*/subscription.unsubscribe();};});
@cartant你能从上面的推荐中做出一个回答并详细说明一下吗?我不能让它对我的情况起作用
const Rx = require('rxjs')

const lazyStateModifier = new Rx.ReplaySubject(1)
    .map(args => {
        console.log('>some logic. args: ', args)
        return {status: 'OK', result: 'new state'}
    })
    .map(res => res.result)

const state = new Rx.Subject().merge(lazyStateModifier)

const changeStateLazy = (args) =>
    lazyStateModifier.next(args)

console.log('>invoke changeStateLazy')
changeStateLazy(42)

console.log('>subscribe')
state.subscribe(
    val => console.log('state.next: ', val),
    err => console.log('state.error: ', err),
    () => console.log('state.complete'))