Javascript 如何为一些特定的非DOM事件创建Rx observable

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) =>

我想处理一些由用户触发的事件。我想用RxJS观测值来做这件事

在我的例子中,用户可以像这样在浏览器的控制台中注册一个函数

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有数百万个操作符,所以也许有更好的方法
共享
在这里确实很重要!thnx
bindCallback
听起来很有趣,也许我可以用它。在您的示例代码中,您从
Observable.create
中返回一个值,据我所知,这是不可能的,对吧?是的。如果您在
Observable.create
中从回调返回函数,则在取消订阅时将调用该函数。查看或可能只是简单地查看
Rx.Subject
实际上,
Subject
并不适合这样做,因为您必须手动执行
window.barfoo.register=oldRegister
。当您返回teardown函数时,您可以确保在源代码完成或您取消订阅时调用该函数。