我有一个订阅,我想用一段中间件代码来表示事件。所以我有一件事想要订阅一个可观察的东西,而另一件事则不是一个可观察的东西。
我考虑过为此使用主题-这就是它们的用途:
const repeater = new Rx.Subject();
function subscribe(observer) {
return repeater.subscribe(observer);
}
// in some other function, call repeater.next(val)
Run Code Online (Sandbox Code Playgroud)
但是后来我开始查看常规的subscription()调用返回了什么。我可以改为:
let sub = null;
function subscribe(observer) {
return Rx.Observable.create((o) => sub = o);
}
// elsewhere sub.next(val)
Run Code Online (Sandbox Code Playgroud)
但是也?
let unsub = null;
function subscribe(observer) {
unsub = Rx.Observable.create(() => false).subscribe(observer)
}
// elsewhere unsub.next(val)
Run Code Online (Sandbox Code Playgroud)
所有这些事情将向订户发出val信号。我在这里不了解的怪异之处是订阅返回有next()可用的内容-我认为next()只存在于Observable上下文中的观察者上。
无论如何,我都需要处理取消订阅的事务-当中间件被拆除时,我需要发出信号流完成并释放一些资源。令我惊讶的是,unsub接下来又起作用了。
这向我发出信号,就观察者,可观察对象和主题等而言,我还只是简单地了解了一些RxJS。通常,我了解如何将事件源和其他类似内容连接到可观察的流中。这实际上只是在从无聊的函数调用中构建可观察的流的上下文中-每当外部库调用该函数时,该流就表示已更新可观察的流。
订户扩展了订阅和观察者,添加了状态。它暴露了一个方法来改变状态(即,unsubscribe()),它也暴露出观察者next()/ error()/ complete()方法,但现在这些方法既荣幸状态,改变状态。
所以,如果我给你一个裸露的观察者,你可以调用next()/ error()/ complete()
以任意顺序就可以了,很多次,只要你想,即使这将是可怕的为你我叫next()你叫我以后complete()。
另一方面,如果我给您提供一个包裹在订户中的观察者,则现在处于状态,并且如果您在调用next()后尝试调用该订户complete(),我将看不到它。如果您致电unsubscribe(),我将被取消联系。
致电订阅时,如
subscriber = Rx.Observable.create(fn).subscribe(observer);
Run Code Online (Sandbox Code Playgroud)
您将找回包装在订户中的同一个观察者,并且只有那个观察者。这就是为什么你看到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?
Run Code Online (Sandbox Code Playgroud)
对于您的用例,您将很可能
next()/ error()/ complete()接口,让你喂操作链的最前端,next()/ error()/ complete()订户接口。取而代之的是,subscribe()仅将由返回的对象视为一个Subscription,并且仅对unsubscribe()它使用方法。所以:
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)
Run Code Online (Sandbox Code Playgroud)
另请参见何时在rxjs中使用asObservable()?。
| 归档时间: |
|
| 查看次数: |
2105 次 |
| 最近记录: |