Как мне подписаться в последовательности и вернуть только значение из последней наблюдаемой в RxJS? - PullRequest
0 голосов
/ 19 октября 2019

Я нахожусь в преобразователе угловых маршрутов и хочу вернуть наблюдаемое.

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

A => B (a) =>C (b)

C зависит от B, а B зависит от A. A должен завершиться, затем B, затем C, но я хочу, чтобы значение C использовалось только для разрешения маршрута.

Я пробовал два разных подхода:

return A.pipe(
  concatMap(a => 
    B(a).pipe(
      concatMap(b => 
        C(b).pipe((c) => c); // also tried of(c)
      )
    )
  )
);

Я также пробовал

return A.pipe(
  concatMap(a => {
    return B(a).pipe(map(b => {a: a, b: b});
  ),
  concatMap({a, b} => {
    return C(b);
  )
);

Как мне подписаться на A, затем B, затем C ... , а затем получить значение только из самой внутренней наблюдаемой?

Если я поставлю метку после моего последнего concatMap, я получу ожидаемое возвращаемое значение. Но мой распознаватель никогда не разрешает? (или испускается неправильная вещь? Я не могу точно сказать.)

Ответы [ 2 ]

2 голосов
/ 19 октября 2019

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

switchMap должно выполнить:

A.pipe(
    switchMap(B), // which is more or less the same as `switchMap(a => B(a))`
    switchMap(C),
).subscribe(//...
1 голос
/ 19 октября 2019

Определители маршрутов должны быть завершены до продолжения работы Angular Router. То же самое относится и к охранникам маршрута. Добавление оператора, который принимает эмиссию, такую ​​как take (1) или first () и завершает, решит проблему.

return A.pipe(
  concatMap(a => {
    return B(a).pipe(map(b => {a: a, b: b});
  ),
  concatMap({a, b} => {
    return C(b);
  ),
  take(1)
);
...