【问题标题】:Combine obserables rxjs 5.5+结合 observables rxjs 5.5+
【发布时间】:2018-11-12 23:38:39
【问题描述】:

考虑以下获取实体并为每个 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
}

在这 3 个动作之后,我希望它看起来像(借助 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);
    }
  }

【问题讨论】:

  • 您确定this.loadModel 会返回任何内容吗?
  • @martin 你说得对,我会发布我在 loadModel 中的内容
  • 例如,您不会重新调整 case 'prop1ID' 中的任何内容。
  • @martin return of(entity);
  • 您不能从同步函数返回异步值。考虑从loadModel 返回一个Promise

标签: typescript rxjs angular6 rxjs6


【解决方案1】:

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

我会重构 loadModel() 以按照@martin 的建议返回一个 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.

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-08-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多