Почему concatMap не работает должным образом? - PullRequest
0 голосов
/ 04 мая 2020

пожалуйста, смотрите мой код ниже

import { Observable, interval } from 'rxjs';
import { map, take, mergeMap, concatMap, switchMap, exhaustMap } from 'rxjs/operators';

const frameworks = ['Backbone', 'Angular', 'React', 'Vue'];

const getRecruits = agency => new Observable(observer => {
  console.log('agency', agency);
  interval(1000).pipe(
    take(5)
  ).subscribe(val => observer.next(`${agency} Developer ${val}`));
});

// concatMap
interval(3000).pipe(
  take(4),
  map(val => frameworks[val]),
  concatMap(agency => getRecruits(agency))
).subscribe(val => console.log(val));

, и это мой вывод:

enter image description here

Я ожидал после завершения Backbone, это продолжилось бы с Angular, React, а затем Vue. Но выполнение остановлено после Backbone

какие-либо объяснения?

Ответы [ 2 ]

1 голос
/ 04 мая 2020

Чтобы завершить sh это вам нужно позвонить observer.complete, в настоящее время код вызывает только observer.next.

, чтобы сделать это, пожалуйста, измените свой код следующим образом

).subscribe(
  val => observer.next(`${agency} Developer ${val}`),
  () => observer.complete(),
  () => observer.complete(),
);
0 голосов
/ 04 мая 2020

ключевые знания

conactMap испускает только следующее наблюдаемое, насколько завершено предыдущее.

причина

Если вы помните об этом и посмотрите на getRecruits , вы увидите, что наблюдаемый внутренний интервал закрывается, но на самом деле ваш вновь созданный new Observable(observer => ...) нет, потому что вы только излучаете значения в observer через next. Вы можете завершить возвращение наблюдаемой одновременно с завершением вашей внутренней подписки.

решение

const getRecruits = agency => new Observable(observer => {
  interval(1000).pipe(
    take(5)
  ).subscribe(
    val => observer.next(`${agency} Developer ${val}`),
    () => void 0, // You can use void 0 for no emit
    () => observer.complete() // Your interval source completes here and you call the new Observalbe to be completed
  );
});
...