【发布时间】:2015-12-14 20:10:20
【问题描述】:
我正在使用一个调用我实现的函数的框架。我希望将此函数的参数转换为 Observable,并通过一系列观察者发送。我以为我可以为此使用主题,但它的行为与我预期的不同。
为了澄清,我有类似以下代码的内容。我认为下面的 Option 1 会起作用,但到目前为止我还是选择了 Option 2,这似乎一点也不习惯。
var eventSubject = new Rx.Subject();
var resultSource = eventSubject.map(processEvent);
var subscription = resultSource.subscribe(
function(event) {
console.log("got event", event);
},
function(e) {
log.error(e);
},
function() {
console.log('eventSubject onCompleted');
}
);
// The framework calls this method
function onEvent(eventArray) {
var eventSource = Rx.Observable.from(eventArray);
// Option 1: I thought this would work, but it doesn't
// eventSource.subscribe(eventSubject);
// Option 2: This does work, but its obviously clunky
eventSource.subscribe(
function(event) {
log.debug("sending to subject");
eventSubject.onNext(event);
},
function(e) {
log.error(e);
},
function() {
console.log('eventSource onCompleted');
}
);
}
【问题讨论】:
-
onEventhandler 是你自己注册的吗? -
无论如何,我能想到的使用
Subject.create(observer, observable)并不会真正导致不那么笨重的东西,因为您将通过的观察者将与您传递给@987654328 的观察者完全相同@,那我们看看其他人的提议吧。 -
@user3743222 - onEvent 是我编写的一个函数,我的框架(环回)知道该函数存在并从它自己的代码中调用它。我不能使用 fromEvent() 或 fromEventPattern() 方法,因为它们与框架注册处理程序的方法不匹配。
-
好的,我的想法是编写你自己的
fromLoopbackEvent,但这不太可能导致更少的代码。您可以查看Rx.DOM.fromWebSocket的实现,以获取使用Subject.create(observer, observable)表单的示例。或文档:github.com/Reactive-Extensions/RxJS/blob/master/doc/api/…。关键是您需要指定观察者,可能没有默认观察者。所以按照你的方式去做,或者其他方式是一样的,但让我们看看。 -
Rx.Observable.prototype.subscribe需要一个观察者或三个函数,并且主体不是观察者。因此,您也可以尝试使用eventSource.subscribe(eventSubject.asObserver())将主题转换为适当的观察者。参见github.com/Reactive-Extensions/RxJS/blob/master/doc/api/core/…。默认行为是一个onNext方法,它发送到链接到主题的可观察对象。
标签: javascript reactive-programming rxjs