从Observable列表中创建一个Observable对象
Create an Observable object from a list of Observables
我仍在思考RxJS,我一直在遇到这种模式,我想找到一种更优雅的写作方式。
在实现model View Intent模式组件的模型部分时,我有一个函数,它将操作作为输入,并返回单个state$
Observable作为输出。
function model(actions) {
const firstProperty$ =
const anotherProperty$ = …
// Better way to write this?
const state$ = Rx.Observable.combineLatest(
firstProperty$, anotherProperty$,
(firstProperty, anotherProperty) => ({
firstProperty, anotherProperty
})
);
return state$;
}
因此,我的model
方法计算了一组可观测值,其中每一个都会发出表示我的应用程序状态的一部分的项。那很好。
但是,我如何将它们干净地组合成一个可观察的、发出状态的对象,每个状态都是一个对象,其键是初始可观察的名称?
我借用了https://github.com/cyclejs/todomvc-cycle:
function model(initialState$, actions){
const mod$ = modifications(actions)
return initialState$
.concat(mod$)
.scan( (state, mod) => mod(state))
.share()
}
function modifications(actions){
const firstMod$ = actions.anAction$.map(anAction => (
state => ({ ...state,
firstProperty: anAction.something
})
const secondMod$ = actions.otherAction$.map(otherAction => (
state => ({ ...state,
firstProperty: otherAction.something,
secondProperty: aComputation(otherAction)
})
return Rx.Observable.merge([firstMod$, secondMod$ ]).share()
}
在主要功能:
const initialState$ = Rx.Observable.from({})
const actions = intent(DOM)
const state$ = model(initialState$, actions).share()
使用CHadrien的帮助,这里有一个有效的解决方案。
const prop1$ = Rx.Observable.of('foo');
const prop2$ = Rx.Observable.of('bar');
const prop3$ = Rx.Observable.of('baz');
const prop4$ = Rx.Observable.of('foobar');
function combineObservables(objectOfObservables) {
const keys = Object.keys(objectOfObservables);
const observables = keys.map(key => objectOfObservables[key]);
const combined$ = Rx.Observable.combineLatest(
observables, (...values) => {
var obj = {};
for (let i = 0 ; i < keys.length ; i++) {
obj[keys[i]] = values[i];
}
return obj;
}
);
return combined$;
}
combineObservables({prop1$, prop2$, prop3$, prop4$}).subscribe(x => console.log(x));
结果:
[object Object] {
prop1$: "foo",
prop2$: "bar",
prop3$: "baz",
prop4$: "foobar"
}
相关文章:
- 引用对象中的通用值
- jQuery匹配JSON对象的部分文本
- 节点导出返回一个空对象
- 如何在Javascript中将JSon对象转换为数组
- 我可以在json对象中添加一个函数吗
- 使用JS将数组转换为json对象
- 全局变量和全局对象的属性之间有什么区别吗
- 比较从函数和生成的日期对象
- Javascript,访问一个主要对象模块模式中的每个对象
- 如果使用 lodash 将属性存在于另一个对象中,则向对象添加属性
- 从Observable列表中创建一个Observable对象
- 将JSON对象转换为敲除observable在IE8中不起作用,但在所有其他浏览器中都起作用
- 将某些observableArray对象属性转换为observable
- 更改observable的observable属性会触发对父对象的订阅
- 带有大对象元素数组的Rxjs后端循环带有observable
- 用相同的fields-names对象填充observable-fields-object
- Extjs -如何使用Ext.util.Observable来获取所有表单对象的事件点击
- 基于observable,从可观察对象的对象中选择observable
- knockoutjs:绑定到一个索引号为特定Observable Array对象的模板
- 如何为RxJS Observable中的每个发射创建一个新对象