当前位置: 首页 > 知识库问答 >
问题:

Observable.ForkJoin带有for循环

景轶
2023-03-14

我正在尝试填充一个名为processs的组件中的数组,它是process的数组。每个进程还有一个任务列表。

因此,目前,我正在处理两个api调用,它们是:

/process/process/{processId}/tasks

我使用/processs获取所有进程,并首先填充processs数组。然后我使用每个process的进程id来调用第二个API,以获取该进程的任务。

当前,我的代码看起来如下所示:

this.processes.forEach((process, index) => {
    myService.getTasks().subscribe((tasks) => {
        process.tasks = tasks;
    })
})

我知道我可以创建一个observables数组,并使用Observable.forkJoin()等待所有这些异步调用完成,但我希望能够为每个调用定义订阅回调函数,因为我需要对Process的引用。我有什么想法可以处理这个问题吗?

共有1个答案

郤令
2023-03-14

应避免使用for循环来发出多个HTTP请求,然后分别订阅所有请求,以避免打开许多observable连接。

正如@Juan Mendes所提到的,observable.forkjoin将返回一个任务数组,该数组与进程数组中每个进程的索引匹配。您还可以在每个进程到达时将任务分配给它们,如下所示:

getTasksForEachProcess(): Observable<any> {

    let tasksObservables = this.processes.map(process, processIdx) => {
        return myService.getTasks(process)
            .map(tasks => {
                this.processes[processIdx].tasks = tasks; // assign tasks to each process as they arrive
                return tasks;
             })
            .catch((error: any) => {
                console.error('Error loading tasks for process: ' + process, 'Error: ', error);
                return Observable.of(null); // In case error occurs, we need to return Observable, so the stream can continue
            });
    });

    return Observable.forkJoin(tasksObservables);
};

this.getTasksForEachProcess().subscribe(
    tasksArray => {
        console.log(tasksArray); // [[Task], [Task], [Task]];
        // In case error occurred e.g. for the process at position 1,
        // Output will be: [[Task], null, [Task]];

        // If you want to assign tasks to each process after all calls are finished:
        tasksArray.forEach((tasks, i) => this.processes[i].tasks = tasksArray[i]);
    }
);

也请看一下这篇文章:发送多个异步HTTP GET请求

 类似资料:
  • 对Java来说很新鲜,我在大学的一个入门班做一个项目。我正在尝试做一个方法,在String数组中搜索输入的状态并返回索引。如果用户输入不在数组中的查询,我希望它要求一个新的状态来搜索。我的例外是说“变量statePotion可能尚未初始化。”下面是代码。 提前谢谢!

  • 问题内容: 我有一个二维布尔数组’poorSignal’,需要编写一个返回网格的方法,如果数组上的某个点为true,则显示X,如果为false,则显示O。这是我的代码: 当我编译时,它在方法的最后一行给出了“丢失的返回语句”。我也不确定在打印数组时’return“ \ n”是否可以添加新行。 这是一个分配问题,所以我不能直接打印它,也不能仅打印布尔值-它必须是产生网格的方法。 问题答案: 编译器无

  • 问题内容: 现在,父级for循环()在第一个findOne触发之前完成,因此,这仅循环通过repliesIDsArray..asynchronous。的最后一个元素。 此代码集的承诺版本的正确语法是什么?Promisification的新手,想知道如何开始Promisify +遍历数组+解释if语句。 蓝鸟是必需的,并且被调用。 问题答案: 正如本杰明所说,不要使用循环,而应使用(或) 在此处查看

  • 我创建了一个2D数组,需要将元素或映射到要打印的彩色像素。这就是我所拥有的。 像素数组,表示不同颜色的整数值 我测试了,它工作得很好。在中的每个for循环旁边都会弹出唯一的错误,其中声明: 此外,int刻度用于定位像素应该在的位置,并赋予其正确的大小

  • 考虑以下代码: 它应该从循环到(231-1),但它没有。一旦达到224,就不再工作了,原因我完全无法理解。 在VS的即时窗口中,我尝试了以下方法: 为什么会这样?2241有什么特别之处?

  • 我对Python比较陌生(我的大部分经验都是在SAS领域),所以请大家多多忍耐。 我试图从现有的数据集创建一些CSV,并根据定义的列表导出它们。CSV的命名应该基于相应的列表值是动态的。 表1_cc.to_csv(r“C:\users\etc\”+cc+“.csv”) 我得到的错误是:typeerror:只能将str(而不是“list”)连接到str 输出应该是3个文件:table1_ad-1.C