我想处理用户触发的一些事件。我想用RXJS可观察力做到这一点。
就我而言,用户可以像这样的浏览器的控制台注册功能
window.barfoo.register((bar, foo) => {
console.log('foo=' + foo + ' bar=' + bar)'
});
现在,要将注册附加到流,我可以像这样包装注册代码
register$ = Rx.Observable.create(observer => {
window.barfoo.register = (callback) => {
observer.next(callback);
};
});
我对此代码有疑问,所以我想知道这是否是解决此问题的正确方法?原因是,我必须在Observable.create
回调中创建功能。在我的情况下,这是一个问题。因为window.barfoo.register
是首先创建(并且无法更改),然后才能创建可观察到的。
window.barfoo = {
register: (cb) => { /* store cb somewhere and trigger something */
};
register$ = Rx.Observable.create(......????.....);
注意:尽管我无法更改事物的顺序,但我可以更改register
的实现!
有什么建议如何设置可观察的?
rxjs 5具有静态构造函数,可以从不同类型的事件中创建可观察力,但我认为您的用例不同。我正在考虑bindCallback()
,但这可能不是您正确理解您的用例时可以使用的。
看来您需要为此使用多播,因为否则您可以多次覆盖该功能,然后只有最新的观察者才会接收任何值(请注意,末尾的share()
操作员)。
var register$ = Rx.Observable.create(observer => {
let oldRegister = window.barfoo.register;
window.barfoo.register = (callback) => {
observer.next(callback);
};
return () => {
window.barfoo.register = oldRegister;
};
}).share();
也可能是一个好主意,返回拆卸功能,将原始函数注册回原始功能。