Angular RXJS:将来自foreach的多个调用组合成一个可观察的

Angular RXJS:将来自foreach的多个调用组合成一个可观察的,angular,loops,foreach,rxjs,observable,Angular,Loops,Foreach,Rxjs,Observable,一段时间以来,我一直在尝试组合多个异步调用,每次接近时,我都会陷入我试图解决的foreach循环中 此时,我将一个类别数组传递给一个函数,该函数将返回一个包含所有问题(所有类别的组合)数组的可观察对象。 我在想 getQuestions(类别:Category[]):可观察{ 让我们问:问题[]; 类别。forEach(c=>{ 这是我的 .getQuestionsCategory(c.id) .管道(地图(问题=>q.push(…问题)); //以某种方式返回q? }); } 然后我就可以这

一段时间以来,我一直在尝试组合多个异步调用,每次接近时,我都会陷入我试图解决的foreach循环中

此时,我将一个类别数组传递给一个函数,该函数将返回一个包含所有问题(所有类别的组合)数组的可观察对象。
我在想

getQuestions(类别:Category[]):可观察{
让我们问:问题[];
类别。forEach(c=>{
这是我的
.getQuestionsCategory(c.id)
.管道(地图(问题=>q.push(…问题));
//以某种方式返回q?
});
}
然后我就可以这样使用它:

let result:result;
let res:[类别[],科目,答案[];
返回此.getResultByOuteparamid(route).pipe(
点击(resu=>(result=resu)),
开关映射((结果:结果)=>
此.forkJoinQuizCategoriesAccountAnswers(结果)
),
点击(结果=>(结果=结果)),
switchMap(x=>this.getQuestions(res[0])),
地图(问题=>{
//创建问题、答案和类别的对象,并将其添加到问题答案对象
//返回包含用户和问答对象列表的新UserResult
返回新的UserResult(null,null);
})
);
这是我能得到的最接近于某人的推荐。我想在我最初的问题中添加这个,但我觉得这不是正确的做法,因为我不再为嵌套的观察值而挣扎,而是在它们上面循环

编辑
我试过别的方法,但我怀疑这是正确的方法

getQuestions(类别:Category[]):可观察{
设ques=categories.map(c=>
this.cs.getQuestionsCategory(this.auth.token,c.id)
);
返回合并(…ques);
}

您应该将这些流与
forkJoin
combinelateest
组合:

getQuestions(categories: Category[]): Observable<Question[]> {
    return forkJoin(
        categories.map(category => this.cd.getQuestionsCategory(category.id))
    ).pipe(tap(questions => { console.log(questions) }));  // Here you can change the data structure of questions instead of just logging them
}
getQuestions(类别:Category[]):可观察{
返回叉连接(
categories.map(category=>this.cd.getQuestionsCategory(category.id))
).pipe(点击(questions=>{console.log(questions)});//在这里,您可以更改问题的数据结构,而不仅仅是记录问题
}

首先,我喜欢将其放入专用函数中,这样您就可以将接口与实现分离开来

你想解决的问题应该在管道中是可行的,这只是一个解决问题的案例

  • 您从一个
    类别的数组开始
  • 对于每个类别,您都希望调用一个服务函数,该函数返回一个可观察的
    问题数组
  • 您希望从函数异步返回问题的扁平数组
我将通过以下方式来处理这一问题:

  • 创建可观察数组。这有助于你理解你从什么开始
  • forkJoin
    可观察数组。它本身将返回一个二维数组
  • 将二维数组映射为平面数组
getQuestions(类别:Category[]):可观察{
//首先,从一组可观察阵列开始
const observables:Observable[]=categories.map(cat=>
这个.cs.getQuestionsCategory(cat.id));
//使用forkJoin并行运行所有可观察对象
返回叉连接(
可观测
).烟斗(
//现在将阵列的阵列映射到展开的阵列
地图(问题=>this.flat(问题))
);
}
//A.平面布置的备选方案()
私人住宅单位(arr:T[]):T[]{
返回arr.reduce((acc,val)=>acc.concat(val),[]);
}

当我尝试这样做时,我得到一个类型“Observable”不可分配给类型“Observable”。异常。这不是异常,是类型错误。您可以将结果映射到您想要的任何内容。尝试使用
pipe(map(questions=>questions.flat())
flat()是新版本的typescript的一部分吗?它似乎没有被识别。flat()是一个数组函数。这可能意味着
问题
不是实际数组。或者您使用的是旧浏览器。您可以使用
reduce
而不是
flat
。我将更新我的答案。它将问题识别为问题[]。根据您发布的链接,它似乎是新版本ES的一部分,我将尝试更新它,看看是否可以修复它。我已将我的答案修改为使用
reduce
。如果这仍然没有得到认可,可能是
问题
不是课程的实际阵列,它不需要有自己的功能。这里的含义是,您可以将其作为公共函数公开。或者,如果您愿意,也可以始终包含一个
平面
多边形填充。