2017-02-20 59 views
1

我想在我的组件中填充一个名为processes的数组,该数组是process的数组。每个process也有一个列表tasksObservable.fork加入for循环

/processes/process/{processId}/tasks

我用/processes让所有的过程,最初填充processes阵列:

所以目前,我与两个API调用它们的工作。然后我使用每个process的进程ID调用第二个API来获取该进程的任务。

目前,我的代码看起来是这样的:

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

我明白,我可以创造可观的数组,并使用Observable.forkJoin()等待所有这些异步调用来完成,但我希望能够到为每个呼叫定义订阅回调函数,因为我需要参考process。关于如何解决这个问题的任何想法?

+0

Observable.forkJoin将返回任务数组相互匹配过程的索引在你的进程数组中 –

回答

4

使用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]); 
    } 
); 

也请看看这篇文章:Send multiple asynchronous HTTP GET requests