gpt4 book ai didi

angular - RXJS:将来自 foreach 的多个调用组合成一个 observable

转载 作者:行者123 更新时间:2023-12-03 23:48:54 24 4
gpt4 key购买 nike

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

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

  getQuestions(categories: Category[]): Observable<Question[]> {
let q: Question[];
categories.forEach(c => {
this.cs
.getQuestionsCategory(c.id)
.pipe(map(questions => q.push(...questions)));
//return q somehow?
});
}


然后我就可以像这样使用它:

   let result: Result;
let res: [Category[], Account, Answer[]];

return this.getResultByRouteParamId(route).pipe(
tap(resu => (result = resu)),
switchMap((result: Result) =>
this.forkJoinQuizCategoriesAccountAnswers(result)
),
tap(results => (res = results)),
switchMap(x => this.getQuestions(res[0])),
map(questions => {
// Create objects of questions, answers and category and add them to a QuestionAnswer object
// Return new UserResult containing the user and a list of QuestionAnswer objects
return new UserResult(null, null);
})
);


这与我在 my previous question 上的建议非常接近。 .我想将此添加到我原来的问题中,但我觉得这不是正确的做法,因为我不再为嵌套的可观察对象而苦苦挣扎,而是在循环它们。

编辑
尝试了其他方法,但我怀疑这是正确的方法

  getQuestions(categories: Category[]): Observable<Question[]> {
let ques = categories.map(c =>
this.cs.getQuestionsCategory(this.auth.token, c.id)
);

return merge(...ques);
}

最佳答案

首先,我喜欢将其放入专用函数中的想法,这样您就可以将接口(interface)与实现分开。

您要解决的问题应该在管道中是可行的,这只是解决正在发生的事情的一个案例。

  • 您从 Category 的数组开始。 .
  • 对于每个类别,您要调用一个服务函数,该函数返回一个可观察的数组 Question .
  • 您想从函数中异步返回扁平化的问题数组

  • 我会通过以下方式解决这个问题:
  • 创建可观察数组。这有助于您了解您从
  • 开始的内容。
  • forkJoin可观察的数组。它本身将返回一个二维数组
  • map二维数组到平面数组

  • getQuestions(categories: Category[]): Observable<Question[]> {
    // firstly, start out with an array of observable arrays
    const observables: Observable<Question[]>[] = categories.map(cat =>
    this.cs.getQuestionsCategory(cat.id));

    // run all observables in parallel with forkJoin
    return forkJoin(
    observables
    ).pipe(
    // now map the array of arrays to a flattened array
    map(questions => this.flat(questions))
    );
    }

    // alternative to arr.flat()
    private flat<T>(arr: T[][]): T[] {
    return arr.reduce((acc, val) => acc.concat(val), []);
    }

    关于angular - RXJS:将来自 foreach 的多个调用组合成一个 observable,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60564529/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com