Angular 嵌套的 observable-subscriptions 到单个 observable
Angular5 nested observable-subscriptions to a single observable
我在服务层有如下代码,我有两个问题:
return this.equipmentService.getEquipment(this.id) //returns subscription
.subscribe((equipment : Equipment) =>
{
this.getEquipmentTags(); //returns subscription
this.getPredictions(); //returns subscription
});
});
- 在代码中,我已经订阅了 equipmentService.getEquipment observable 和
现在它 returns 订阅对象 - 我怎样才能使它成为一个可观察的对象
再次,以便可以在 业务层 中再次处理,例如
- 我怎么知道所有内部可观察对象都完成了它们的任务并触发了一个事件(或调用一个方法或创建另一个我可以稍后在代码中订阅的可观察对象)
我想你要找的是主题。
Subject 可以充当 Observable 或 Observer,因此您可以订阅它或调用 .next()
发送事件。它们还包含有用的方法,例如 complete()
或 error()
,允许您控制特定主题的状态。
这里 a useful article 涵盖了主题的基础。
不要过早触发订阅,正如@igor 指出的那样,你(this.equipmentService.getEquipment(this.id)
不 returns 订阅,它 returns 一个 Observable,因为在其他方面你无法订阅它),使用 concatMap
(和管道运算符)来链接你的 Observables。
getChainedObservables() {
return this.equipmentService.getEquipment(this.id)
.pipe(
concatMap((equipment : Equipment) => this.getEquipmentTags()),
concatMap(() => this.getPredictions())
);
}
那就调用吧,
this.getChainedObservables().subscribe(console.log);
我在服务层有如下代码,我有两个问题:
return this.equipmentService.getEquipment(this.id) //returns subscription
.subscribe((equipment : Equipment) =>
{
this.getEquipmentTags(); //returns subscription
this.getPredictions(); //returns subscription
});
});
- 在代码中,我已经订阅了 equipmentService.getEquipment observable 和 现在它 returns 订阅对象 - 我怎样才能使它成为一个可观察的对象 再次,以便可以在 业务层 中再次处理,例如
- 我怎么知道所有内部可观察对象都完成了它们的任务并触发了一个事件(或调用一个方法或创建另一个我可以稍后在代码中订阅的可观察对象)
我想你要找的是主题。
Subject 可以充当 Observable 或 Observer,因此您可以订阅它或调用 .next()
发送事件。它们还包含有用的方法,例如 complete()
或 error()
,允许您控制特定主题的状态。
这里 a useful article 涵盖了主题的基础。
不要过早触发订阅,正如@igor 指出的那样,你(this.equipmentService.getEquipment(this.id)
不 returns 订阅,它 returns 一个 Observable,因为在其他方面你无法订阅它),使用 concatMap
(和管道运算符)来链接你的 Observables。
getChainedObservables() {
return this.equipmentService.getEquipment(this.id)
.pipe(
concatMap((equipment : Equipment) => this.getEquipmentTags()),
concatMap(() => this.getPredictions())
);
}
那就调用吧,
this.getChainedObservables().subscribe(console.log);