如何处理具有严重可观察特性的可观察对象?

时间:2018-12-19 09:04:28

标签: angular rxjs

我有一个可观察的物体。当我订阅时,已将附加属性定义为可观察到的。

const obj = {
  a: 'some text'
};
const b$ = of('BBB').pipe(delay(1000));
const c$ = of('CCC');

const obj$ = of(obj).pipe(delay(100));

const res$ = obj$.pipe(
  map(obj => Object.assign({
    b: b$,
    c: c$
  }, obj))
)

const subscribe = res$.subscribe(val => console.log(val));

输出仍然包含可观察到的东西

{a: "some text", b: Observable, c: Observable}

但预期输出应为:

{a: "some text", b: "BBB", c: "CCC"}

我该如何解决?这是StackBlitz:https://stackblitz.com/edit/typescript-6euwct

2 个答案:

答案 0 :(得分:3)

combineLatest将带您到达那里。

combineLatest(b$, c$, obj$)
  .pipe(
    map(([b, c, obj]: any) => ({
      b,
      c, 
      obj
    })),
  )
  .subscribe(console.log);

每当它们中的任何一个发出值时,您的最终订阅都会触发,例如这样做:

const c$ = interval(1000).pipe(map( () => of('CCC')));

将每秒重新发射一次。或者只是interval(1000)就会每秒更改C的值。

答案 1 :(得分:1)

如果您想等到所有可观察物都完成,那么您可能想尝试forkJoin

const obj = {
  a: 'some text'
};
const b$ = of('BBB').pipe(delay(1000));
const c$ = of('CCC');

const obj$ = of(obj).pipe(delay(100));

const res$ = forkJoin(
  obj$,
  b$,
  c$
).pipe(map(([obj, b, c]: any) => ({ obj, b, c })))

const subscribe = res$.subscribe(val => console.log(val));

这将等到所有可观察到的对象完成之后,再触发订阅块。