我有一个可观察的物体。当我订阅时,已将附加属性定义为可观察到的。
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
答案 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));
这将等到所有可观察到的对象完成之后,再触发订阅块。