Angular RXJS:将来自foreach的多个调用组合成一个可观察的
一段时间以来,我一直在尝试组合多个异步调用,每次接近时,我都会陷入我试图解决的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? }); } 然后我就可以这
我在想
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
。如果这仍然没有得到认可,可能是问题
不是课程的实际阵列,它不需要有自己的功能。这里的含义是,您可以将其作为公共函数公开。或者,如果您愿意,也可以始终包含一个平面多边形填充。