Rxjs 使用subscription.next()是否为反模式?
我有一个订阅,我想用它在一段中间件代码中发出事件信号。所以我有一件事想要订阅一个可观测的,另一件事不完全是可观测的 我想用主题来做这件事——这就是他们的目的:Rxjs 使用subscription.next()是否为反模式?,rxjs,rxjs5,Rxjs,Rxjs5,我有一个订阅,我想用它在一段中间件代码中发出事件信号。所以我有一件事想要订阅一个可观测的,另一件事不完全是可观测的 我想用主题来做这件事——这就是他们的目的: const repeater = new Rx.Subject(); function subscribe(observer) { return repeater.subscribe(observer); } // in some other function, call repeater.next(val) 但后来我开始研究常
const repeater = new Rx.Subject();
function subscribe(observer) {
return repeater.subscribe(observer);
}
// in some other function, call repeater.next(val)
但后来我开始研究常规subscribe()调用返回的内容。我可以这样做:
let sub = null;
function subscribe(observer) {
return Rx.Observable.create((o) => sub = o);
}
// elsewhere sub.next(val)
而且呢
let unsub = null;
function subscribe(observer) {
unsub = Rx.Observable.create(() => false).subscribe(observer)
}
// elsewhere unsub.next(val)
所有这些都将向订户发送val信号。这里我不明白的一件奇怪的事情是订阅返回有一个next()
可供使用-我认为next()
只存在于可观察上下文中的观察者上
无论发生什么,我都需要对取消订阅doodad保持一个句柄——当中间件被拆除时,我需要发出流完成信号并释放一些资源。令我惊讶的是,不明嫌犯有一个正常运作的下一个
这向我发出了一个信号,有一些RXJ,我只是简单地说,在观察者、被观察者和主体等方面,我还没有摸索过。一般来说,我了解如何将事件源和其他类似的东西连接到一个可观察的流中。实际上,这只是在从一个无聊的函数调用中构建一个可观察流的上下文中——每当外部库调用该函数时,该流都会发出一个更新的可观察流的信号。订阅者扩展订阅和观察者,添加状态。它公开了一种更改状态的方法(即,
unsubscribe()
),以及
它还公开了观察者的next()
/error()
/complete()
方法,
但这些方法现在既尊重国家,也改变国家
所以,如果我给你一个简单的观察者,你可以调用next()
/error()
/complete()
按任何顺序,按你想要的次数,即使是
在调用mycomplete()
之后调用mynext()
对您来说太糟糕了
另一方面,如果我给你一个裹在
订户,现在有状态了,如果您尝试调用next()
on
在你调用complete()
之后,我就看不到它了。
如果您调用unsubscribe()
,我将被分离
当您呼叫subscribe时,如
subscriber = Rx.Observable.create(fn).subscribe(observer);
你得到的是同一个观察者,只有那个观察者,
包装在订户中。这就是为什么您会看到next()
/error()
/complete()
方法。但这些方法通常是供内部使用的,如果您使用它们为观察者提供信息,它将无法实现您的预期:
let observerA = {
next: (x) => console.log('A: value: ' + x),
error: (x) => console.log('A: error: ' + x),
complete: () => console.log('A: completed')
}
let observerB = {
next: (x) => console.log('B: value: ' + x),
error: (x) => console.log('B: error: ' + x),
complete: () => console.log('B: completed')
}
let observable = Rx.Observable.create(() => false);
let subscriberA = observable.subscribe(observerA);
let subscriberB = observable.map(x => 10*x).subscribe(observerB);
subscriberA.next(1); // only feeds observerA
// => "A: value: 1"
subscriberB.next(2); // only feeds observerB
// => "B: value: 2" // What?
可能性是,对于您的用例,您将
next()
/error()
/complete()
接口,让您可以为操作员链的前端提供反馈next()
/error()
/complete()。相反,将subscribe()
返回的对象视为仅订阅,并且仅对其使用unsubscribe()
方法
另请参见。Aha!下一步(2);//=>“B:value:2”零件确实固化了它。现在这很有道理。真棒的回答。
let subject = new Rx.Subject();
let subscriptionA = subject.subscribe(observerA);
let subscriptionB = subject.map(x=>10*x).subscribe(observerB);
subject.next(3);
// => A: value: 3
// => B: value: 30
subscriptionA.unsubscribe()
subject.next(4);
// => B: value: 40
subscriptionB.unsubscribe()
subject.next(5);
// (no output)