2016-11-14 4 views
1

私は値と観測値の混在したオブジェクトで自分自身を見つけました。平野オブジェクトのストリームを取得するには、このオブジェクトにcombineLatestような何かを行うための最善の方法だろう何ObservablesのオブジェクトにRxJS combineLatest?

const mixedObject = { 
    field1: "Hello", 
    field2: Rx.Observable.of('World'), 
    field3: Rx.Observable.interval(1000), 
}; 

:ような何か。 FIELD2しばらく値は常にフィールド1であるとの観測がFIELD3ある場合は、指定されていませんでした

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

例えば、私のような何かをしたいと思います。私はより一般的な解決策を提供しようとします。

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)); 
関連する問題