2016-08-31 12 views
6

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ę?

+1

Parametr searchNameStream nigdy się nie kończy, więc obserwacja uzyskana z switchMap nigdy się nie kończy. –

+0

nie jest to możliwe do zaobserwowania przez this.heroService.getHeroesByName (name)? – Quba

+1

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. –

Odpowiedz

3

Nigdy nie kończy się searchNameStream, więc obserwowalne uzyskane z switchMap nigdy się nie kończy.

każdym razem zdarzenie jest emitowany przez searchNameStream, heroService.getHeroesByName() nazywa i wszystkie zdarzenia emitowane przez ten „wewnętrzny” obserwowalny są emitowane przez „zewnętrzną” obserwowalne, aż nowe zdarzenie jest emitowany przez searchNameStream, a tym procesie powtarza. Subskrybowałeś zewnętrzne obserwowalne, które zakończy się dopiero po ukończeniu searchNameStream.

Powiązane problemy