加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

angular 2 Observable完全没有调用

发布时间:2020-12-17 07:10:32 所属栏目:安全 来源:网络整理
导读:我正在玩角度2教程的英雄应用程序,现在我有这个组件 import { Component,OnInit } from '@angular/core'import { Subject } from 'rxjs/Subject';import { Hero } from "./hero";import { Router } from "@angular/router";import { HeroService } from "./h
我正在玩角度2教程的英雄应用程序,现在我有这个组件

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

}

问题是,如果我理解正确,订阅需要三个回调参数.subscribe(success,failure,complete);.但就我而言,完整的部分永远不会被执行.我想这与switchMap的工作原理有关.我对吗?

解决方法

searchNameStream永远不会完成,因此从switchMap获取的observable也不会完成.

每次searchNameStream发出一个事件时,都会调用heroService.getHeroesByName(),并且“inner”observable发出的所有事件都被“outer”observable重新发送,直到searchNameStream发出一个新事件,并且这个过程重复.您订阅了外部observable,只有在searchNameStream完成时才会完成.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读