2017-02-27 30 views
1

我想處理由用戶觸發的一些事件。我想用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是數百萬運營商,所以也許有更好的方法 –

回答

1

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' –

相關問題