Javascript 如何为一些特定的非DOM事件创建Rx observable
我想处理一些由用户触发的事件。我想用RxJS观测值来做这件事 在我的例子中,用户可以像这样在浏览器的控制台中注册一个函数Javascript 如何为一些特定的非DOM事件创建Rx observable,javascript,rxjs,observable,Javascript,Rxjs,Observable,我想处理一些由用户触发的事件。我想用RxJS观测值来做这件事 在我的例子中,用户可以像这样在浏览器的控制台中注册一个函数 window.barfoo.register((bar, foo) => { console.log('foo=' + foo + ' bar=' + bar)' }); register$ = Rx.Observable.create(observer => { window.barfoo.register = (callback) =>
window.barfoo.register((bar, foo) => {
console.log('foo=' + foo + ' bar=' + bar)'
});
register$ = Rx.Observable.create(observer => {
window.barfoo.register = (callback) => {
observer.next(callback);
};
});
现在,要将注册附加到流,我可以像这样包装注册代码
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(......????.....);
注意:虽然我不能更改事情的顺序,但我可以更改寄存器的实现
有没有关于如何设置可观察对象的建议?RxJS 5有静态构造函数,可以从不同类型的事件创建可观察对象,但我认为您的用例是不同的。我在考虑,但如果我正确理解您的用例,那么这可能不是您可以使用的
看起来您需要为此使用多播,因为否则您可能会多次重写该函数,然后只有最新的观察者才会收到任何值(请注意末尾的share()
操作符)
另外,返回一个将原始函数注册回来的拆卸函数也可能是一个好主意。因此您想用(回调)=>{…}
覆盖window.barfoo.register
函数?是的,我可以替换register函数,这意味着我的第一个代码示例可以工作。但这是最好的解决办法。我知道Observable有数百万个操作符,所以也许有更好的方法共享在这里确实很重要!thnxbindCallback
听起来很有趣,也许我可以用它。在您的示例代码中,您从Observable.create
中返回一个值,据我所知,这是不可能的,对吧?是的。如果您在Observable.create
中从回调返回函数,则在取消订阅时将调用该函数。查看或可能只是简单地查看Rx.Subject
实际上,Subject
并不适合这样做,因为您必须手动执行window.barfoo.register=oldRegister
。当您返回teardown函数时,您可以确保在源代码完成或您取消订阅时调用该函数。