【问题标题】:How to detect unsubscribe in Observer如何在观察者中检测退订
【发布时间】:2018-04-27 08:08:09
【问题描述】:

我对新的 Observable 进行了 http 调用,但无法检测到订阅是否被取消:

constructor( @Inject(Http) private http: Http) {
}


...


const observable = Observable.create((observer: Observer<any>) => {
            this.http.post(url, body)
                .subscribe((p) => {
                    observer.next(p.json());
                    observer.complete();
                }, (err) => {
                    observer.error(err);
                    observer.complete();
                });
        });
const subscription = observable.subscribe((r) => { alert("result : "+r); }, (err) => { alert("error occured");}

subscription.unsubscribe(); // if user cancels the request

如果用户取消订阅,我如何在Observable.create(...) 中检测到?我想在外部 Observable 被取消时取消 http post 请求。

【问题讨论】:

    标签: observable angular5 rxjs5


    【解决方案1】:

    您可以手动创建unsubscribe 函数,如:

     constructor(public http: HttpClient) {
        let url = 'google.kz';
    
        const observable = Observable.create((observer: Observer<any>) => {
          let cancel: Subscription = this.http.post(url, {})
            .subscribe((p) => {
              observer.next(p);
              observer.complete();
            }, (err) => {
              observer.error(err);
              observer.complete();
            });
    
          // Provide a way of canceling and disposing the internal observables
          return function unsubscribe() {
            cancel.unsubscribe();
          };
        });
    
        let unsc = observable.subscribe(data => {
          console.log(data);
        })
        console.log('unsubscribe', unsc);
    
        unsc.unsubscribe();
      }
    

    所以,当你调用外部 observable 的 unsubscribe() 函数时,内部 observable 也会取消订阅,这取决于它是如何实现的

    StackBlitz Demo

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-06-11
      • 1970-01-01
      • 2020-04-08
      • 2019-02-07
      • 1970-01-01
      • 2013-03-31
      • 1970-01-01
      相关资源
      最近更新 更多