使用 RxJs 将多个回调 returns 映射到可观察对象中
map multiple callback returns into observable using RxJs
我目前正在开始使用 RxJs 并尝试定义返回可观察对象的模块。 (每个模块都作为一个黑盒工作,只公开它的可观察值)。
我的主要问题是由于我使用的第三方库:UWA:
我的所有 dom 元素都是从 UWA 对象生成并触发 UWA "events"。
顺便说一句,我想将这些自定义事件映射到可观察对象。
这是事件数据结构的一部分:
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)->
(其中有一个未知数 n 的 dblclick...)
映射到:
cbObservable : ----(1:{old,new})--|
----(2:{old,new})--|
....
----(n:{old,new})--|
而我目前想要的是:
outputStream : ----(1:{old,new})---(2:{old,new})--...(n:{old,new})--->
其中 outputStream 是一个热可观察对象;
有没有办法在上述所有限制条件下做到这一点?
谢谢!
尝试使用 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]}
});
})
或类似的东西,然后对生成的可观察对象进行单一订阅
@llCorvinuSll:谢谢你的回答,经过简单的修改后它就可以工作了:
正在将 call(yourObject) 添加到 bindCallback !
bindCallback return 一个函数,所以需要调用它:
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]}
});
})
我目前正在开始使用 RxJs 并尝试定义返回可观察对象的模块。 (每个模块都作为一个黑盒工作,只公开它的可观察值)。 我的主要问题是由于我使用的第三方库:UWA: 我的所有 dom 元素都是从 UWA 对象生成并触发 UWA "events"。 顺便说一句,我想将这些自定义事件映射到可观察对象。 这是事件数据结构的一部分:
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)->
(其中有一个未知数 n 的 dblclick...) 映射到:
cbObservable : ----(1:{old,new})--|
----(2:{old,new})--|
....
----(n:{old,new})--|
而我目前想要的是:
outputStream : ----(1:{old,new})---(2:{old,new})--...(n:{old,new})--->
其中 outputStream 是一个热可观察对象; 有没有办法在上述所有限制条件下做到这一点? 谢谢!
尝试使用 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]}
});
})
或类似的东西,然后对生成的可观察对象进行单一订阅
@llCorvinuSll:谢谢你的回答,经过简单的修改后它就可以工作了:
正在将 call(yourObject) 添加到 bindCallback ! bindCallback return 一个函数,所以需要调用它:
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]}
});
})