jestem zabawy z hero aplikacji fro kątowa 2 samouczka i teraz mam tego składnikakątowa 2 Obserwowalne kompletna nie nazywa
import { Component, OnInit } from '@angular/core'
import { Subject } from 'rxjs/Subject';
import { Hero } from "./hero";
import { Router } from "@angular/router";
import { HeroService } from "./hero.service";
import { BehaviorSubject } from "rxjs/BehaviorSubject";
@Component({
selector: 'hero-search',
templateUrl: 'app/hero-search.component.html',
styleUrls: ['app/hero-search.component.css'],
})
export class HeroSearchComponent implements OnInit{
heroes: Hero[];
isLoading: BehaviorSubject<boolean> = new BehaviorSubject(false);
error: any;
private searchNameStream = new Subject<string>();
constructor(
private heroService: HeroService,
private router: Router
) {}
ngOnInit() {
this.searchNameStream
.debounceTime(400)
.distinctUntilChanged()
.switchMap(name => {
this.isLoading.next(true);
return this.heroService.getHeroesByName(name)
})
.subscribe(
heroes => this.heroes = heroes,
error => this.error = error,
() => {
console.log('completed');
this.isLoading.next(false);
})
}
// Push a search term into the observable stream.
search(Name: string): void {
this.searchNameStream.next(Name)
}
gotoDetail(hero: Hero): void {
let link = ['/detail', hero.id];
this.router.navigate(link);
}
}
Problemem jest to, że jeśli rozumiem go poprawnie, zapisz przyjmuje trzy parametry zwrotnych .subscribe(success, failure, complete);
. Ale w moim przypadku cała część nigdy nie zostanie wykonana. Myślę, że ma to coś wspólnego z działaniem switchMap. Czy mam rację?
Parametr searchNameStream nigdy się nie kończy, więc obserwacja uzyskana z switchMap nigdy się nie kończy. –
nie jest to możliwe do zaobserwowania przez this.heroService.getHeroesByName (name)? – Quba
Nie. Za każdym razem, gdy zdarzenie jest emitowane przez searchNameStream, wywoływane jest 'heroService.getHeroesByName()', a wszystkie zdarzenia emitowane przez to "wewnętrzne" obserwowalne są ponownie emitowane przez "zewnętrzne" obserwowalne, dopóki nowe wydarzenie nie zostanie wysłane przez searchNameStream, a proces ten się powtarza. Subskrybujesz zewnętrzne obserwowalne, które zakończy się dopiero po zakończeniu wyszukiwaniaNameStream. –