RxJS 在 Observables 的对象上结合最新?
RxJS combineLatest on object of Observables?
我发现自己的价值观和观察对象是混合的。类似于:
const mixedObject = {
field1: "Hello",
field2: Rx.Observable.of('World'),
field3: Rx.Observable.interval(1000),
};
在此对象上执行类似 combineLatest
的操作以获取普通对象流的最佳方法是什么。
例如,我想做这样的事情:
Rx.Observable.combineLatest(mixedObject).subscribe(plainObject => {
console.log(plainObject.field1, plainObject.field2, plainObject.field3);
// Outputs:
// > Hello World 0
// > Hello World 1
// > Hello World 2
});
您没有指定 field1 是否始终是一个值,而 field2 和 field3 是可观察的。我会尝试给出一个更通用的解决方案。
function mixedToSync(obj: any): Observable<any> {
return Observable.combineLatest(
Object.keys(obj).map((key: string) => {
let value = obj[key];
if(Observable.prototype.isPrototypeOf(value)){
return value.map(v => ({[key]: v}));
} else {
return Observable.of({[key]: value});
}
}))
.map(propsObservables => Object.assign({}, propsObservables));
}
然后你就可以在你的对象上使用它了:
mixedToSync(mixedObject).subscribe(v => console.log(v));
或匹配您的示例:
mixedToSync(mixedObject).subscribe(v => console.log(v.field1, v.field2, v.field3));
const res = combineLatest({ foo: a$, bar: b$, baz: c$ });
res.subscribe(({ foo, bar, baz }) => { console.log(foo, bar, baz); });
注意:Angular 截至今天尚未在 v7 上。
我发现自己的价值观和观察对象是混合的。类似于:
const mixedObject = {
field1: "Hello",
field2: Rx.Observable.of('World'),
field3: Rx.Observable.interval(1000),
};
在此对象上执行类似 combineLatest
的操作以获取普通对象流的最佳方法是什么。
例如,我想做这样的事情:
Rx.Observable.combineLatest(mixedObject).subscribe(plainObject => {
console.log(plainObject.field1, plainObject.field2, plainObject.field3);
// Outputs:
// > Hello World 0
// > Hello World 1
// > Hello World 2
});
您没有指定 field1 是否始终是一个值,而 field2 和 field3 是可观察的。我会尝试给出一个更通用的解决方案。
function mixedToSync(obj: any): Observable<any> {
return Observable.combineLatest(
Object.keys(obj).map((key: string) => {
let value = obj[key];
if(Observable.prototype.isPrototypeOf(value)){
return value.map(v => ({[key]: v}));
} else {
return Observable.of({[key]: value});
}
}))
.map(propsObservables => Object.assign({}, propsObservables));
}
然后你就可以在你的对象上使用它了:
mixedToSync(mixedObject).subscribe(v => console.log(v));
或匹配您的示例:
mixedToSync(mixedObject).subscribe(v => console.log(v.field1, v.field2, v.field3));
const res = combineLatest({ foo: a$, bar: b$, baz: c$ });
res.subscribe(({ foo, bar, baz }) => { console.log(foo, bar, baz); });
注意:Angular 截至今天尚未在 v7 上。