【问题标题】:Observable forkjoin subscribe types可观察的 forkjoin 订阅类型
【发布时间】:2018-02-26 22:50:06
【问题描述】:

我正在使用键入的响应进行 2 个 API 请求调用,并将它们组合成一个 Observable.forkJoin。我想在不同类型的变量中得到两个结果。

var observableOrganization: Observable<Organization> = this.getOrganizationDetails();
var observablePromotion: Observable<Promotion[]> = this.getPromotions();

Observable.forkJoin([ observableOrganization, observablePromotion])
    .subscribe(
        response => {
            organization: Organization = response[0];
            promotions: Promotion[] = response[1];
        },
        error => {
            // ...
        }
    );

如何在单个订阅响应中获得键入的结果?

【问题讨论】:

  • “输入”是指例如。这个Observable&lt;Promotion[] | Organization &gt;?或者你想合并结果?
  • 我不想要合并的结果,我更喜欢分离的类型。
  • 老实说,我不明白你想要实现什么或什么不起作用......
  • 在 .subscribe((response)) 中,响应类型默认为 Organization[]。这是错误的,我进行了 2 次 api 调用,这给了我 2 种不同的类型(组织和提升 []),而不是组织 []
  • 这是你正在做的github.com/ReactiveX/rxjs/blob/master/src/observable/…,它返回Observable&lt;[Organization, Promotion[]]&gt;

标签: angular typescript rxjs observable


【解决方案1】:

使用 es6 解构也可以添加类型,如果它们没有自动分配

 Observable.forkJoin([ observableOrganization, observablePromotion])
        .subscribe(([org, prom]: [Organization, Promotion[]]) => {
            organization:Organization = org;
            promotions: Promotions[] = prom
        },
        error => {
            //error here
        });

【讨论】:

  • 感谢您的帮助,但我无法编译:.subscribe([response1, prom]: [Organization, Promotion[]]) => { });
  • 在 .subscribe([org, prom]: 中出现此错误:'any[]' 类型的参数不可分配给 '(value: Organization[]) => void' 类型的参数.
  • 问题可能出在这行代码 var observableOrganization: Observable = this.getOrganizationDetails(); var observablePromotion: Observable = this.getPromotions();
  • 检查这个函数的类型
  • 或者用完整的代码更新问题会更容易。
【解决方案2】:

forkJoin 只会在请求被显式声明为 ObservalbleInput 时返回“nice”类型。

我个人更喜欢这种语法,使用destructing 语言特性:

const requests: [ObservableInput<Organization>, ObservableInput<Promotion[]>] = [observableOrganization, observablePromotion];
Observable.forkJoin(requests)
    .subscribe(
        ([organization, promotions]: [Organization, Promotion[]]) => {
            // use organization and promotions here
        },
        error => {
            // ...
        }
    );

【讨论】:

  • 这不是因为您通过执行以下操作在此处明确输入您的订阅值:[Organization, Promotion[]。在任何情况下我都没有得到这个工作。
  • @rumblefx0 你确定,你用ObservableInput 处理所有个请求吗?它对我很有效。
  • 嗯,你能展示一下你是如何实例化 observableOrganization 和 observablePromotion 的吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-07-21
  • 1970-01-01
  • 1970-01-01
  • 2016-10-29
  • 2019-06-19
  • 1970-01-01
相关资源
最近更新 更多