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