如何在不停止排队的呼叫的情况下并行进行异步呼叫

时间:2020-03-05 18:01:17

标签: angular asynchronous

我有50个科目,我发送了50个并行呼叫,每个科目返回1个或多个学生数据 例如:如果我发送一个subjectId,则this.subjectService.getStudentsData(subjectId) 它返回学生数据:

[
{StudentId:1,
"FirstName":'firstName', 
"ListOfSubjects":[{Subjectid:1,SubjectName:'Maths', .....somedata:[{1:a,2:b...}, {3:y,2:x...}]}},

{
StudentId:2, 
FirstName:secondName, 
.
.
ListOfSubjects:[
{Subjectid:1,SubjectName:'Maths', .....somedata:[{c:1,d:2...}, {a:y,b:x...}]}}]

现在我需要绑定,因为我要通过用户数据来获取用户,但是要花15分钟才能完成所有服务调用

我用的是

const requests: any = subjectIds.map(id => {   
            const t: any = {...data};
            t.SubjectId = [id];
          return this.studentService.getStudentsData(t);
        });

1 个答案:

答案 0 :(得分:0)

mamichels所说的,您可以使用forkJoin,但我记得读过forkJoin最多只能进行6次,除非您可能使用dictionary

我会做的:

const requests: any = combineLatest(...subjectIds.map(id => this.studentService.getStudentData(id) /* you know what should go in the argument */)
...
requests.subscribe(responseArray => console.log(responseArray));

==========================编辑==================== =====

要通知每个请求已完成,我将使用merge

import { merge } from 'rxjs';

const requests: any = merge(...subjectIds.map(id => this.studentService.getStudentData(id));

....
requests.subscribe(response => { /* handle each response as it returns */ }));

=================好的,尝试旧的方式===============

for (let i = 0; i < subjectIds.length; i++) {
  this.studentService.getStudentsData(subjectIds[i].StudentId/* again, I am not sure what goes here as argument */).subscribe(
  response => {
    console.log(response);
  }
);
}
相关问题