如何为某些特定的非DOM事件创建可观察的Rx



我想处理用户触发的一些事件。我想用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();

也可能是一个好主意,返回拆卸功能,将原始函数注册回原始功能。

最新更新