rxjs主题switchmap http错误

Zap*_*hod 5 error-handling rxjs ionic2 angular

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

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

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

  }
}
Run Code Online (Sandbox Code Playgroud)

小智 1

问题是,当流出现错误时,它就会结束。如果你想处理http错误但保持主流活动,你应该在http流级别处理错误。请参阅这篇文章 -错误处理。当错误杀死流时该怎么办

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