Rxjs 为什么concatMap没有按预期工作?

Rxjs 为什么concatMap没有按预期工作?,rxjs,concatmap,Rxjs,Concatmap,请看下面我的代码 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 Observabl

请看下面我的代码

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));
这是我的输出:

我预计在主干完成后,它将继续以角度,反应,然后Vue。但在那之后,死刑停止了


有什么解释吗?

要完成它,您需要调用observer.complete,目前代码只调用observer.next

要做到这一点,请像那样更改您的代码

).subscribe(
  val => observer.next(`${agency} Developer ${val}`),
  () => observer.complete(),
  () => observer.complete(),
);
关键知识

仅发射下一个可见光,直到前一个已完成

理由

如果您记住这一点并查看GetRecrupt,您可以看到内部interval observable关闭,但实际上您新创建了一个新的ObserveObserver=>。。。不会,因为您仅通过“下一步”向观察者发射值。您可以在完成内部订阅的同时完成返回的可观察项

解决方案


我刚才看到你的回答和几分钟前一样。抱歉重复回答,但我没有更新问题,因为几分钟后,我在回答中添加了一些注释。我高度赞赏并推荐您的简短回答风格!
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
  );
});