Angular rxjs6中concat和merge的区别
我有Angular rxjs6中concat和merge的区别,angular,rxjs,rxjs6,Angular,Rxjs,Rxjs6,我有课程$可观察,它由初始课程$和搜索课程$可观察组合而成 initialLessons$在页面加载时发出,以获取课程列表,用户在搜索输入中键入时发出searchLessons$emit以获取过滤结果 当我使用concat组合这些可观察对象时,只有initialLessons$可观察对象发出,它似乎根本不订阅searchLessons$。我用merge替换了它,效果很好 我只想知道这个案子的解释是什么 export class CourseComponent implements OnInit,
课程$
可观察,它由初始课程$
和搜索课程$
可观察组合而成
initialLessons$
在页面加载时发出,以获取课程列表,用户在搜索输入中键入时发出searchLessons$
emit以获取过滤结果
当我使用concat
组合这些可观察对象时,只有initialLessons$
可观察对象发出,它似乎根本不订阅searchLessons$
。我用merge
替换了它,效果很好
我只想知道这个案子的解释是什么
export class CourseComponent implements OnInit, AfterViewInit {
@ViewChild('searchInput') input: ElementRef;
courseId: string = this.route.snapshot.params['id'];
course$: Observable<Course>;
lessons$: Observable<Lesson[]>;
constructor(private route: ActivatedRoute) {}
ngOnInit() {
this.course$ = createHttpObservable(`/api/courses/${this.courseId}`);
}
ngAfterViewInit() {
const initialLessons$: Observable<Lesson[]> = this.loadLessons();
const searchLessons$: Observable<Lesson[]> = fromEvent<any>(
this.input.nativeElement,
'keyup'
).pipe(
debounceTime(400),
map(event => event.target.value),
distinctUntilChanged(),
switchMap(search => this.loadLessons(search))
);
this.lessons$ = merge(initialLessons$, searchLessons$);
}
loadLessons(search = ''): Observable<Lesson[]> {
return createHttpObservable(`/api/lessons?courseId=${this.courseId}&pageSize=100&filter=${search}`
).pipe(map(res => res['payload']));
concat
将仅在前一个可观测源完成时订阅下一个可观测源
这是代码中没有发生的事情。由createHttpObservable
创建的可观察对象永远不会完成。它只发出一个next()
,但没有complete()
。这就是为什么你会经历你所描述的concat
从未订阅过searchLessons$
,因为initialLessons$
从未完成
既然您已经在调用。那么(data=>observer.next(data))
您也可以在那里添加complete()
call
.then(data => {
observer.next(data);
observer.complete();
})
这是因为concat只有在你的观测完成后才会发射。。。由于上述场景中FromEvent从未完成,因此它将不起作用。。。其中merge发出所有值,即使它不完整。如何使用createHttpObservable的代码。@JBNizet我已将其添加到问题中,为什么不直接使用Angular HttpClient?它返回行为正确的可观察对象(即它们已完成)。我认为在接下来的任务中我要做的是:)
.then(data => {
observer.next(data);
observer.complete();
})