Angular Observables возвращают анонимную функцию - PullRequest
0 голосов
/ 09 января 2020

У меня есть этот метод, который я скопировал из учебника по веб-сокетам, но я не понимаю значения "return () => {...}" внутри наблюдаемого? Может кто-нибудь объяснить мне, какова цель этого?

  public onMessage(topic: string, handler = SocketClientService.jsonHandler) : Observable<any> {
    return this.connect().pipe(first(), switchMap(client => { 
      return new Observable<any>(observer => {
        const subscription : StompSubscription = client.subscribe(topic, message => {
            observer.next(handler(message));
        });
        return () => {
          console.log("Unsubscribe from socket-client service");
          client.unsubscribe(subscription .id);
        }
      });
    }));
  }

1 Ответ

1 голос
/ 09 января 2020

Чтобы создать Observable, вы можете использовать new Observable или оператор создания. См. Следующий пример:

const observable = new Observable(function subscribe(subscriber) {
  subscriber.next(1);
  subscriber.next(2);
  subscriber.next(3);
});

Вы можете предоставить функцию unsubscribe(), позволяющую утилизировать ресурсы, и эта функция входит внутрь subscribe() следующим образом:

const observable = new Observable(function subscribe(subscriber) {
  subscriber.next(1);
  subscriber.next(2);
  subscriber.next(3);

  return function unsubscribe() {
    console.log('Clearing resources on observable');
  };
});

Конечно можно использовать выражение функции стрелки , чтобы иметь:

const observable = new Observable((observer) => {
  observer.next(1);
  observer.next(2);
  observer.next(3);

  return () => {
    console.log('Clearing resources on observable');
  };
});

Попробуйте следующий код для проверки наблюдаемого:

const subscription = observable.subscribe(res => console.log('observable data:', res));
subscription.unsubscribe();

Наконец, subscription.unsubscribe() - это собираемся удалить соединение с сокетом в вашем примере.

Найдите проект, работающий с этими примерами, здесь: https://stackblitz.com/edit/typescript-observable-unsubscribe

Дайте мне знать, если это поможет!

...