angular – 订阅限制结果

前端之家收集整理的这篇文章主要介绍了angular – 订阅限制结果前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我是RxJS的新手.我在我的一个Angular应用程序中使用它.我想实现以下目标.对于给定的user_ids集合:ex [1,2,3],(i)从数据库提取用户详细信息,一旦我获得用户详细信息,然后我想从其他数据库表中提取user_reservation详细信息(ii)订阅并在ngOnDestroy()方法中释放订阅.

这是我试过的……

let user_ids= [1,3];

user_ids.forEach
((id) =>
{
    this.subscription = this.http.get(`https://someUrl/api/userdetails/${id}`)
        .pipe(
            map((x:any) => x.id),concatMap(userid => 
                this.http.get(`https://someUrl/api/reservationDetails? 
                         userId=${userid}`)),take(2)
         ).subscribe();
})


    ngOnDestroy(): void {
          if(this.subscription) { 
              this.subscription.unsubscribe();
              this.subscription = null;
          }
    }

它给了我结果,但是当我想限制预订细节时(我只想采取前两个预订细节),(i)它没有工作,而是返回给定用户ID的所有预订细节. (ii)我在forEach()循环中声明订阅(this.subscription).它会产生任何副作用吗?,因为重复初始化相同的订阅.任何指导表示赞赏.

编辑:
作为JGFMK,请我提供有关数据库操作的更多信息.我正在更新我的帖子.我使用sql Server作为后端.但我不限制服务器端查询的行.我只想获取两个随机(行)结果,我认为RxJS take(2)将仅通过两行来限制结果. (如果我错了,请求你纠正我).

解决方法

take(2)不按你想要的方式工作.如果您的observable发出值的流,它将只需要前2个值并取消订阅流.

要获得前2行用户详细信息,您必须在API中实现它以限制结果并将其传递给url查询,例如https:// someUrl / api / reservationDetails?userId = ${userid}& limit = 2然后您的API将使用LIMIT再次从数据库进行查询.

更新:对于您的订阅,您实际上只取消订阅上次订阅,并且您在此处有内存泄漏.处理它的更好方法是:

let user_ids= [1,3];
this.subscriptions = new Subscription();

user_ids.forEach
((id) =>
{
    this.subscriptions.add(this.http.get(`https://someUrl/api/userdetails/${id}`)
        .pipe(
            map((x:any) => x.id),take(2)
         ).subscribe());
})


    ngOnDestroy(): void {
          this.subscriptions.unsubscribe();
    }

猜你在找的Angularjs相关文章