首页 > 解决方案 > forkJoin 结果与源中的地图

问题描述

我正在尝试使用forkJoin将几个可观察对象(真实代码中的 http 请求)的结果放在一起。

其中一个源 observable(mainObs如下)map应用了一个运算符,以便输出与其他 observable 具有相同的格式。

我的问题是,在forkJoin订阅中,第一个结果是一个 observable,而不是第一个 observable 的输出。

这是一个示例代码,带有一个stackblitz 演示

我错过了什么吗?

import { forkJoin, Observable, of } from 'rxjs'; 
import { map } from 'rxjs/operators';

let mainObs = of("main").pipe(map(res => of({success: true, result: res})));

let listOfObservables: Observable<any>[] = [mainObs];

listOfObservables.push(createObs());
listOfObservables.push(createObs());

forkJoin(listOfObservables).subscribe((res: any[]) => {
      console.log(res);
      //Problem: res[0] is an Observable, not a value
      console.log(res[0].success);// <==error
      
    });
    

function createObs()
{
  return of({success: true, result: "dummy"})
}

标签: typescriptrxjsobservable

解决方案


of创建一个新的可观察对象。因此mainObs,当它返回时,您会返回一个新的 observable。

您可能打算返回实际结果:

import { forkJoin, Observable, of } from "rxjs";
import { map } from "rxjs/operators";

let mainObs = of("main").pipe(map(res => ({ success: true, result: res })));

// creating a typed array helps preventing this problem early.
let listOfObservables: Observable<{ success: boolean; result: string }>[] = [
  mainObs
];

listOfObservables.push(createObs());
listOfObservables.push(createObs());

forkJoin(listOfObservables).subscribe(
  (res: { success: boolean; result: string }[]) => {
    console.log(res);
    console.log(res[0].success); // <== ok
  }
);

function createObs() {
  return of({ success: true, result: "dummy" });
}

StackBlitz 示例


推荐阅读