RxJS结合了Observables的对象?

时间:2016-11-14 04:51:48

标签: rxjs5

我发现自己有一个价值观和可观察性的混合对象。类似的东西:

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

2 个答案:

答案 0 :(得分:2)

This is now in RXJS 7

const res = combineLatest({ foo: a$, bar: b$, baz: c$ });

注意:截至今天,Angular 尚未发布到 v7。

答案 1 :(得分:1)

您没有指定field1是否始终是值,而field2和field3是observables。我将尝试提供更通用的解决方案。

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