2017-02-20 8 views
1

processesという配列内に、processの配列である配列を設定しようとしています。各processにはtasksのリストもあります。forループを使用したObservable.forkJoin

ので、現在、私は2回のAPI呼び出しで働いています:

/processes/process/{processId}/tasks

私はすべてのプロセスを取得し、最初にprocesses配列を移入するために/processesを使用しています。次に、それぞれprocessのプロセスIDを使用して2番目のAPIを呼び出し、そのプロセスのタスクを取得します。

現在、私のコードは次のようになります。

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

私は観測の配列を作成し、完了するために呼び出して、これらすべての非同期を待つObservable.forkJoin()を使用できることを理解しますが、私のことができるようにしたいですprocessへの参照が必要なので、それぞれの呼び出しに対してsubscribeコールバック関数を定義します。どのように私はこの問題に近づくことができるかについての任意のアイデア?

+0

Observable.forkJoinは、各プロセスの指標と一致するタスクの配列を返します。あなたのプロセス配列で –

答えて

4

ループを使用して複数の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

関連する問題