Как обнаружить отписку в Обозревателе - PullRequest
0 голосов
/ 27 апреля 2018

Я перевожу http-вызов на новый Observable, но не могу определить, отменена ли подписка:

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 (...), отменяет ли пользователь подписку? Я хотел бы отменить запрос http post при отмене внешнего Observable.

1 Ответ

0 голосов
/ 27 апреля 2018

Вы можете вручную создать функцию 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();
  }

Итак, когда вы вызываете unsubscribe() функцию внешней наблюдаемой, внутренняя наблюдаемая тоже отписывается в зависимости от того, как она реализована

Демонстрация StackBlitz

...