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

如何为一些特定的非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?

+0

所以你想覆盖'(callback)=> {...}''window.barfoo.register'函数? – martin

+0

是的,我可以替换注册函数,这意味着我的第一个代码示例将工作。但那是最好的解决方案。我知道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(); 

此外,它可能是一个好主意,返回一个注册原始函数的拆卸函数。

+0

'share'在这里确实很重要! thnx'bindCallback'听起来很有趣,也许我可以以某种方式使用它。在你的示例代码中,你从'Observable.create'内返回一个值,据我所知,这是不可能的,对吧? –

+0

是的。如果你从'Observable.create'中的回调函数返回一个函数,它将在退订时被调用。见https://github.com/Reactive-Extensions/RxJS/blob/master/doc/api/core/operators/create.md – martin

+0

或者只是'Rx.Subject' –