Лучший способ передачи данных между операторами RxJS? - PullRequest
0 голосов
/ 08 мая 2019

Я хочу передать URL, кроме получения данных ответа, в следующем операторе RxJS.Как вы думаете, какой самый умный способ достичь этого?Заранее спасибо.

Вот пример.https://stackblitz.com/edit/angular-rxjs-passing-data-to-next-operator-question

Я попробовал несколько операторов, но не смог найти подходящего.(На самом деле, я даже не знаю, почему передача функции, которая возвращает наблюдаемую mergeMap, приводит к получению данных в качестве параметра функции в следующем операторе ...)

from([
  'https://jsonplaceholder.typicode.com/posts',
  'https://jsonplaceholder.typicode.com/comments',
  'https://jsonplaceholder.typicode.com/albums',
])
  .pipe(
    mergeMap(url => this.getData(url)),
    tap(posts => console.log(posts[0])), // I want to get url too here!!
  ).subscribe();

Я ожидаю получить URL и егоданные ответа в виде пары в операторе pipable.

Ответы [ 2 ]

5 голосов
/ 08 мая 2019

Вы можете сопоставить ответ с чем угодно:

from([
  'https://jsonplaceholder.typicode.com/posts',
  'https://jsonplaceholder.typicode.com/comments',
  'https://jsonplaceholder.typicode.com/albums',
]).pipe(
    mergeMap(url => this.getData(url).pipe(
      map(response => ({ response, url })),
    )),
    tap(response => console.log(response)),
  ).subscribe();
1 голос
/ 08 мая 2019

Глядя на подпись mergeMap mergeMap(project: function: Observable, resultSelector: function: any, concurrent: number): Observable, вы можете использовать аргумент resultSelector:

from([
  'https://jsonplaceholder.typicode.com/posts',
  'https://jsonplaceholder.typicode.com/comments',
  'https://jsonplaceholder.typicode.com/albums',
])
  .pipe(
    mergeMap(url => 
      this.getData(url),
      (outerValue, innerValue) => ({ url: outerValue, posts: innerValue })),
    tap(({ posts, url })=> {
      console.log(posts);
      console.log(url);
    })
  ).subscribe();

Это эффективно отобразит как url, так и результат this.getData(url) для объекта, который можно использовать в tap().

Вот ваш пример , измененный, чтобы показать это в действии.

ПРИМЕЧАНИЕ: селекторы результатов находятся в процессе устаревания / удаления .Хотя это решение в настоящее время может работать, оно больше не будет жизнеспособным в будущей версии RxJS (7.x).Ответ @martin определенно более «ориентирован на будущее».

Надеюсь, это поможет!

...