如何为一些特定的非DOM事件创建Rx可观察性
我想处理由用户触发的一些事件。我想用RxJS Observables来做到这一点。如何为一些特定的非DOM事件创建Rx可观察性
在我的情况,用户可以在浏览器中的这样
window.barfoo.register((bar, foo) => {
console.log('foo=' + foo + ' bar=' + bar)'
});
控制台现在登记的功能,向登记附加到流I可以包装这样
register$ = Rx.Observable.create(observer => {
window.barfoo.register = (callback) => {
observer.next(callback);
};
});
注册码
我对此代码有怀疑,所以我想知道这是否是解决此问题的正确方法?原因是,我必须在Observable.create
回调中创建函数。在我的情况下是一个问题。因为window.barfoo.register
是在创建observable之前首先创建的(我无法更改)。
window.barfoo = {
register: (cb) => { /* store cb somewhere and trigger something */
};
register$ = Rx.Observable.create(......????.....);
注:虽然我不能改变事物的秩序,我可以改变的register
执行!
任何建议如何设置observable?
RxJS 5有静态构造函数来创建来自不同类型事件的Observables,但我认为你的用例是不同的。我在考虑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();
此外,它可能是一个好主意,返回一个注册原始函数的拆卸函数。
'share'在这里确实很重要! thnx'bindCallback'听起来很有趣,也许我可以以某种方式使用它。在你的示例代码中,你从'Observable.create'内返回一个值,据我所知,这是不可能的,对吧? –
是的。如果你从'Observable.create'中的回调函数返回一个函数,它将在退订时被调用。见https://github.com/Reactive-Extensions/RxJS/blob/master/doc/api/core/operators/create.md – martin
或者只是'Rx.Subject' –
所以你想覆盖'(callback)=> {...}''window.barfoo.register'函数? – martin
是的,我可以替换注册函数,这意味着我的第一个代码示例将工作。但那是最好的解决方案。我知道Observable是数百万运营商,所以也许有更好的方法 –