2016-11-14 156 views
1

我发现自己与价值观和可观察对象的混合对象。喜欢的东西:RxJS组合最大可观察对象?

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 
}); 

回答

0

如果FIELD1总是同时场2的值和字段3是可观察的时候没有指定。我会尝试给出一个更一般的解决方案。

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));