angular - 结合最新和返回值
问题描述
在第一个示例中,我有一个调用此 ClientService 的组件。首先我们调用 loadClientMetrics 来填充属性,然后获取属性并立即将它们发送到 calculateClientInsightsMetrics 函数中。但是,我想像第二个示例中那样更改服务以利用服务中的属性,而不必将它们拉出来只是为了将它们传回。下面是我想做的,但是 combineLatest 之前没有返回返回值,并返回 undefined。有人可以帮我吗?我正在寻找一种在返回值返回之前让 combineLatest 完成的方法。
主要问题是我有一个进行异步调用的同步方法。
export class ClientService {
private metrics = new BehaviorSubject<ClientMetrics>(undefined);
public metrics$ = this.metrics.asObservable().pipe(distinctUntilChanged(), shareReplay(1));
private clients = new BehaviorSubject<Client[]>(undefined);
public clients$ = this.clients.asObservable().pipe(distinctUntilChanged(), shareReplay(1));
private clientsBySHID = new BehaviorSubject<Client[]>(undefined);
public clientsBySHID$ = this.clientsBySHID.asObservable().pipe(distinctUntilChanged(), shareReplay(1));
...
public loadClientMetrics(forceReload: boolean = false) {
this.loadMetrics(forceReload);
this.loadClients(forceReload);
this.loadClientsByShareholderID(forceReload);
}
...
public calculateClientInsightsMetrics(metrics: ClientMetrics[], clients: Client[], kycClients: Client[], clientFilter: string): ClientInsightsMetric[] {
let metrics = new Array<ClientInsightsMetric>();
...Do stuff
return metrics;
}
}
export class ClientService {
private metrics = new BehaviorSubject<ClientMetrics>(undefined);
public metrics$ = this.metrics.asObservable().pipe(distinctUntilChanged(), shareReplay(1));
private clients = new BehaviorSubject<Client[]>(undefined);
public clients$ = this.clients.asObservable().pipe(distinctUntilChanged(), shareReplay(1));
private clientsBySHID = new BehaviorSubject<Client[]>(undefined);
public clientsBySHID$ = this.clientsBySHID.asObservable().pipe(distinctUntilChanged(), shareReplay(1));
...
public loadClientMetrics(forceReload: boolean = false) {
this.loadMetrics(forceReload);
this.loadClients(forceReload);
this.loadClientsByShareholderID(forceReload);
}
...
public calculateClientInsightsMetrics(clientFilter: string): ClientInsightsMetric[] {
let metrics = new Array<ClientInsightsMetric>();
this.loadClientMetrics(false);
combineLatest([
this.metrics$,
this.clients$,
this.clientsBySHID$
]).subscribe(data => {
...Do stuff with the data[0], data[1], and data[2]
});
return metrics;
}
}
解决方案
看起来传递给subscribe
( ) 的回调在' 执行data => { ....
中没有同步执行。calculateClientInsightsMetrics
它可能看起来像这样:
- 称呼
calculateClientInsightsMetrics
- 调用
combineLatest
并将订阅者回调传递subscribe
给返回的可观察对象。请注意,您的订阅者回调中定义的任何工作都尚未完成。 - 返回
metrics
(尚未分配给!) - 某个非零时间之后,订阅事件发生并
metrics
在订阅者回调中分配(为时已晚)。
换句话说,您需要一种强制同步执行的方法(查看combineLatest
的文档),或者您更有可能需要“承诺”您的订阅(注意这需要异步执行):
public async calculateClientInsightsMetrics(clientFilter: string): ClientInsightsMetric[] {
let metrics = new Array<ClientInsightsMetric>();
this.loadClientMetrics(false);
metrics = await new Promise(resolve => combineLatest([
this.metrics$,
this.clients$,
this.clientsBySHID$
])
.subscribe(data => {
// do what you need to do and call resolve(), passing the value for metrics
resolve(data);
}));
return metrics;
}
请注意,这违背了订阅的全部目的:您将只能使用传递给订阅者回调的第一个/下一个值。
推荐阅读
- laravel - 无法在 Laravel Vue Axios 中更新具有相同值的多行
- jpa - wildfly-preview-25.0.0.Final - Jakarta 'org.hibernate.ogm.jpa.HibernateOgmPersistence' 未找到
- microservices - 不共享数据库的微服务设计
- windows - 为什么 .npmrc 未定义(在 Windows 上)?
- python - 如何在pygame python中渲染多行字符串
- ruby-on-rails - RSpec 控制器 GET #index 测试返回一个空的 ActiveRecord 数组而不是我的模型
- reactjs - algolia + reactjs:自动完成插件查询建议:显示空白用户界面
- javascript - 以特定方式更改给定字符串的顺序
- sql - 针对数据集在表中运行多个 SQL 查询
- javascript - 角度的电子邮件验证