使用RxJ将多个回调映射返回到observable

时间:2017-08-10 16:20:03

标签: javascript rxjs5

我正在尝试使用RxJs并尝试定义返回observables的模块。 (每个模块都作为黑盒子工作,只暴露其可观察量)。 我的主要问题是由于我正在使用的第三方库:UWA: 我的所有dom元素都是从UWA对象生成的,并触发UWA“事件”。 顺便说一句,我想将这些自定义事件映射到observables。 这是事件数据结构的一部分:

tabBar = *somecode*...{
....
  onEndEditTab: function (callback) {
    return this.modelEvent.subscribe({
      event: endEditTabEvent
    }, callback);
  },....
}

这是我目前的代码:

const tabBar = new tabBar();
tabBar.inject(domContainer);
const observer={
  next: (t) =>{
    const oldValue=t.target.textContent;
    const cbObservable = Rx.Observable.bindCallback(tabBar.onEndEditTab);
    //a new cbObservable is created at each dblclick event
    // (due to bindCallBack property which is to retern only one time.
    cbObservable .call(tabBar).subscribe(
      (v) => {
         console.log({oldLabel:oldValue,newLabel:v[0].button.label});
      }
    );          
Rx.Observable.fromEvent(tabBar, 'dblclick').subscribe(observer);

每次编辑选项卡标签时,此代码都会起作用并记录旧值和新值。 但是目前我想要的不仅仅是打印它,而是将所有这些结果聚合成一个新的Observable流。 使用大理石图:

dblclick : ----(1)----(2)---....(n)->

(其中有一个未知数量的dblclick ...) 映射到:

cbObservable : ----(1:{old,new})--|
               ----(2:{old,new})--| 
               ....
               ----(n:{old,new})--|

我目前想要的是:

outputStream : ----(1:{old,new})---(2:{old,new})--...(n:{old,new})--->

其中outputStream是一个热的可观察对象; 有没有办法用上面描述的所有约束来做到这一点? 谢谢!

2 个答案:

答案 0 :(得分:0)

尝试使用switchMap

Rx.Observable.fromEvent(tabBar, 'dblclick').switchMap(() => {
    const oldValue=t.target.textContent;
    return Rx.Observable.bindCallback(tabBar.onEndEditTab).map((v) => {
       return {old: oldValue, new: v[0]}
    });
})

或类似的东西,然后对结果可观察的

进行单一订阅

答案 1 :(得分:0)

@llCorvinuSll :感谢您的回答,经过一次简单的修改后,它正在运作:

将call(yourObject)添加到bindCallback! bindCallback返回一个函数,因此需要调用它:

Rx.Observable.fromEvent(tabBar, 'dblclick').switchMap(() => {
    const oldValue=t.target.textContent;
    return Rx.Observable.bindCallback(tabBar.onEndEditTab).call(tabBar).map((v) => {
       return {old: oldValue, new: v[0]}
    });
})