如何发送大量请求,但如何处理第一个请求的结果,然后再使用angular和Observables发送第二个请求

时间:2019-04-11 14:44:57

标签: angular rxjs observable

从第一个请求this.userService.getAll()开始,我有500个用户,对于每个用户,我都请求他们拥有2个其他属性(列表)。不幸的是,它一次发送了所有1000个请求,并且它没有先处理第一个请求,而是处理第二个请求,依此类推。我希望第一个用户及其属性P1的结果立即显示在页面上。我可以看到所有请求在发送后都已处理,因为日志来自“ console.log('请求一个结果');”。在请求日志之后打印。我从角度使用rxjs库和httpClient。该应用程序的角度为7。

this.userService.getAll().subscribe((data: any) => {
      this.users = data.users;
      if (data && data.users){
        data.users.forEach(user => {

            this.userService.getP1(user.id).subscribe(
            (data: any) => { 
                console.log('request one result');
                if(data) user.p1 = data.p1; });

            this.userService.getP2(user.id).subscribe(
            (data: any) => { 
                console.log('request two result');
                if(data) user.p2 = data.p2; });
      }
    })

1 个答案:

答案 0 :(得分:1)

您可以使用concat()顺序订阅可观察对象。 Concat将从连续的每个可观察值中发出值。可观察的对象一次又一次地完成。

this.userService.getAll().subscribe((data: any) => {
      this.users = data.users;

      const observables = data.users.map(user => {
          return combineLatest(
              this.userService.getP1(user.id),
              this.userService.getP2(user.id)
          );
      });

      concat(...observables).subscribe(([dataP1, dataP2]) => {
         console.log({dataP1,dataP2});
         if(dataP1) user.p1 = dataP1.p1;
         if(dataP2) user.p2 = dataP2.p2;
      });
    });