Angular rxjs主题切换映射http错误

Angular rxjs主题切换映射http错误,angular,error-handling,rxjs,ionic2,Angular,Error Handling,Rxjs,Ionic2,我正在使用Subject、switchMap和.next()在触发新的http.get()请求时取消以前挂起的http调用 问题是当我处理http错误(如超时)时,html中调用的方法\u postpchc.next(…)不再起作用。。。 我是否需要在出现错误时重新创建订阅?怎么做 import {Component} from '@angular/core'; import {NavController, NavParams, Toast} from 'ionic-angular'; impo

我正在使用
Subject
switchMap
.next()
在触发新的
http.get()
请求时取消以前挂起的http调用

问题是当我处理http错误(如超时)时,html中调用的方法
\u postpchc.next(…)
不再起作用。。。 我是否需要在出现错误时重新创建订阅?怎么做

import {Component} from '@angular/core';
import {NavController, NavParams, Toast} from 'ionic-angular';
import {Http, URLSearchParams} from '@angular/http';
import {AppSettings} from '../../appSettings';
import {Subject} from 'rxjs/Subject';


@Component({
  templateUrl: 'build/pages/video/video.html'
})
export class VideoPage {
  _postMPCHC: any= new Subject();

  constructor(private http: Http, private nav: NavController) {
    this.defineHttp();
  }

  defineHttp() {

    var sub = this._postMPCHC.switchMap((x: string) => {
      let params: URLSearchParams = new URLSearchParams();
      params.set('token', AppSettings.API_TOKEN);
      params.set('prog', 'mhz');
      params.set('prog', 'mpchc');
      params.set('action', x);

      return this.http.get(AppSettings.API_ENDPOINT, { search: params })

    }).timeout(5000, new Error('timeout exceeded')).subscribe(x => { },
      error => {
        let toast = Toast.create({
          message: 'Server response: ' + <any>error,
          duration: 3000,
          position: 'middle'
        });
        this.nav.present(toast);
      })

  }
}
从'@angular/core'导入{Component};
从'ionic angular'导入{NavController,NavParams,Toast};
从'@angular/Http'导入{Http,URLSearchParams};
从“../../AppSettings”导入{AppSettings};
从'rxjs/Subject'导入{Subject};
@组成部分({
templateUrl:'build/pages/video/video.html'
})
导出类视频页{
_postMPCHC:any=新主题();
构造函数(专用http:http、专用nav:NavController){
这个.defineHttp();
}
defineHttp(){
var sub=此.\u postMPCHC.switchMap((x:string)=>{
让params:URLSearchParams=新的URLSearchParams();
参数集('token',AppSettings.API_token);
参数集('prog','mhz');
参数集('prog','mpchc');
参数集('action',x);
返回此.http.get(AppSettings.API_端点,{search:params})
}).timeout(5000,新错误('timeout extended')).subscribe(x=>{},
错误=>{
让toast=toast.create({
消息:“服务器响应:”+错误,
时长:3000,
位置:'中间'
});
这是我的生日礼物(敬酒);
})
}
}

问题在于,当流出现错误时,它就结束了。如果您希望处理http错误但保持主流活动,则应该在http流级别上处理错误。 见本文-


因此,在您的情况下,您可以通过添加
.pipe(catchError(…)
)来处理
处的错误,并返回此.http.get(AppSettings.API_ENDPOINT,{search:params})
行-它将使您的mai流保持活动状态,并将捕获http错误

您可以重新订阅错误吗?