2017-02-20 5 views
1

Я пытаюсь заполнить массив в моем компоненте под названием processes, который представляет собой массив из process. Каждый process также имеет список tasks.Observable.forkJoin with for loop

Так в настоящее время я работаю с двумя API вызовов, которые:

/processes и /process/{processId}/tasks

Я использую /processes получить все процессы и сначала заполнить processes массив. Затем я использую идентификатор процесса для каждого process, чтобы вызвать второй 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