我想将我的应用程序状态写为
对所有输入可观察量进行reduce
(或更确切地说scan
)函数。
const inputStream$ =
Rx.Observable.merge(all$, observables$, Im$, interested$, in$);
const outputStream$ = inputStream$.scan(accumulator, initialState);
由于 inputStream$
可以包含任何值,因此 accumulator
函数
必须进行大量类型检查,这看起来相当脆弱。
我正在寻找的是这样的:
function accumulator (acc, x) {
switch (x) {
case "all$ has fired":
return newState0;
case "observables$ has fired":
return newState1;
case "Im$ has fired":
return newState2;
case "interested$ has fired":
return newState3;
case "in$ has fired":
return newState4;
} }
这可能吗?
最佳答案
当然。只需将 map
运算符应用于每个输入流,即可在合并之前向该值添加鉴别器:
Rx.Observable.prototype.tag = function (tag) {
return this.map(value => ({ tag, value }));
};
const inputStream$ = Rx.Observable.merge(a.tag("a"), b.tag("b"), ...);
const outputStream$ = inputStream$.scan(v => {
const value = v.value;
switch (v.tag) {
case "a": return newState0;
case "b": return newState1;
...
}
}, initialState);
关于javascript - `reduce/scan` 的累加器函数中的可观察类型是否匹配?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32186726/