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
);
});