2016-11-14 229 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));