Ограничение результата подпиской - PullRequest
0 голосов
/ 17 февраля 2019

Я новичок в 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) он не работает, вместо этого он возвращает все детали резервирования данного идентификатора пользователя.(ii) Я объявляю подписку (this.subscription) внутри цикла forEach ().Это будет иметь какие-либо побочные эффекты?потому что одна и та же подписка инициализируется повторно.Любое руководство приветствуется.

Редактировать: Как JGFMK, попросил меня предоставить больше информации о работе базы данных.Я обновляю свой пост.Я использую SQL Server в качестве бэкэнда.Но я не ограничиваю строку из запроса на стороне сервера.Я просто хотел бы получить два случайных (строки) результата, я думал, что RxJS take (2) ограничит результаты, взяв только две строки.(Прошу вас поправить меня, если я ошибаюсь).

1 Ответ

0 голосов
/ 17 февраля 2019

take(2) не работает так, как вы этого хотите.Если ваша наблюдаемая испускает поток значений, она будет принимать только первые 2 значения и отписываться от потока.

Чтобы получить первые 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();
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...