订阅限制结果

时间:2019-02-17 09:58:37

标签: angular typescript rxjs

我是RxJS的新手。我在Angular应用程序之一中使用它。我想实现以下目标。对于给定的一组user_ids:ex [1、2、3],(i)从数据库中提取用户详细信息,一旦获得用户详细信息,便想从其他数据库表中提取user_reservation详细信息(ii)通过ngOnDestroy()方法订阅并释放订阅。

这是我尝试过的...

let user_ids= [1,2,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)将仅通过两行来限制结果。 (如果我错了,请您纠正我。)

1 个答案:

答案 0 :(得分:1)

take(2)不能按照您想要的方式工作。如果您的可观察对象发出值流,则它将仅接收前两个值,并取消订阅该流。

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

更新:至于您的订阅,实际上您实际上仅从最后一个订阅中取消订阅,并且这里存在内存泄漏。处理它的更好方法是:

let user_ids= [1,2,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),

            concatMap(userid => 
                this.http.get(`https://someUrl/api/reservationDetails? 
                         userId=${userid}`)),

             take(2)
         ).subscribe());
})


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