Объединение 2 потоков с операцией подписки для каждого - PullRequest
0 голосов
/ 04 июля 2018

У меня есть следующий код, который выполняет ту же операцию, но для двух разных ID:

Этот раздел предназначен для получения моего объекта темы:

this.route.paramMap
  .pipe(
    map(params => this.threadId = params.get('threadId')),
    switchMap(threadId => this.threadsStoreService.threads
      .pipe(map(threads => threads.find(threadItem => threadItem._id === threadId))))
  )
  .subscribe(thread => this.thread = thread);

и этот раздел предназначен для получения объекта моего сообщения:

this.route.paramMap
  .pipe(
    map(params => this.messageId = params.get('messageId')),
    switchMap(messageId => this.messagesStoreService.messages
      .pipe(map(messages => messages.find(messageItem => messageItem._id === messageId))))
  )
  .subscribe(message => this.message = message);

Поскольку мне нужно подписаться на каждый поток для получения объектов (потока и сообщения), мне интересно, есть ли способ объединить эти потоки вместе? Я пытался с forkJoin безуспешно.

Заранее спасибо за ответ.

Ответы [ 2 ]

0 голосов
/ 04 июля 2018

Вы можете объединить ваши данные в массив и получить поток и сообщение. В этом примере вы должны заполнить типы «поток» и «сообщение».

type SubscriptionOutputTypes = [<insert thread type here> , <insert message type here>];
this.route.paramMap
  .pipe(
    map(params => {
      this.threadId = params.get('threadId');
      this.messageId = params.get('messageId')
    }),
    switchMap( _ =>
              zip(
                this.threadsStoreService.threads.pipe(map(threads => threads.find(threadItem => threadItem._id === this.threadId)))
                ,
                this.messagesStoreService.messages.pipe(map(messages => messages.find(messageItem => messageItem._id === this.messageId)))
              )
             )
  )
  .subscribe( ([thread, message] : SubscriptionOutputTypes) => {
    this.thread = thread;
    this.message = message;
  });
0 голосов
/ 04 июля 2018

Можно использовать оператор tap (ранее известный как do).

tap позволяет вам добавлять Наблюдателя в любом месте цепочки труб.

Так что в вашем случае вы могли бы иметь что-то вроде

любимый

У меня есть следующий код, который выполняет ту же операцию, но для двух разных ID:

Этот раздел предназначен для извлечения объекта моего потока:

const thread$ = this.route.paramMap
  .pipe(
    map(params => this.threadId = params.get('threadId')),
    switchMap(threadId => this.threadsStoreService.threads
      .pipe(map(threads => threads.find(threadItem => threadItem._id === threadId)))),
    tap(thread => this.thread = thread)
  );

const message$ = this.route.paramMap
  .pipe(
    map(params => this.messageId = params.get('messageId')),
    switchMap(messageId => this.messagesStoreService.messages
      .pipe(map(messages => messages.find(messageItem => messageItem._id === messageId)))),
    tap(message => this.message = message)
  );

merge(thread$, message$).subscribe()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...