首页 > 解决方案 > 结合 oberables rxjs 5.5+

问题描述

考虑以下获取实体并为每个 ID 属性加载相关模型的代码(加载外键对象):

if (!lazyLoad) {
    return this.http.get(`${environment.endpoint}/file`, {
          params: params
        }).pipe(
          mergeMap(res => this.loadModel(res, 'prop1ID')),
          mergeMap(res => this.loadModel(res, 'prop2ID')),
          mergeMap(res => this.loadModel(res, 'prop2ID'))
        )
      }
}

第一个合并工作,第二个得到undefind。试图阅读mergemergeAll没有成功。

http请求中的对象如下所示:

{
        id: '1',
        name: 'user',
        prop1ID: 34,
        prop2ID: 44,
        prop3ID: 54
}

在这三个动作之后,我希望它看起来像(在loadModel()功能的帮助下):

{
        id: '1',
        name: 'user',
        prop1ID: 34,
        prop1IDModel: { ... },
        prop2ID: 44,
        prop2IDModel: { ... },
        prop3ID: 54
        prop3IDModel: { ... },
}

我的loadModel功能:

private loadModel(entity, modelProperty): Observable<object> {
    switch (modelProperty) {
      case 'prop1ID':
          this.generalService.getProp1ID(entity.prop1ID).subscribe((data) => {
            entity.prop1IDModel = data;
            return of(entity);
          });
        break;
      case 'prop2ID':
        ...
        break;
      case 'prop3ID':
        ...
        break;
      default:
        return of(entity);
    }
  }

标签: typescriptrxjsangular6rxjs6

解决方案


你的 switch 语句实际上并没有返回一个 Observable——使用订阅中的语句,如果 Observable 涉及异步任务return,你总是会在返回任何内容之前到达该语句。break

正如@martin 建议的那样,我将重构 loadModel() 以返回 Observable:

private loadModel(entity, modelProperty): Observable<object> {
    switch (modelProperty) {
      case 'prop1ID':
          return this.generalService.getProp1ID(entity.prop1ID)
          .mergeMap((data) => {
            entity.prop1IDModel = data;
            return Observable.of(entity);
          });
        break;
        // etc.

推荐阅读