Angular Observables 返回匿名函数

Posted

技术标签:

【中文标题】Angular Observables 返回匿名函数【英文标题】:Angular Observables return anonymous function 【发布时间】:2020-01-08 22:40:35 【问题描述】:

我有这个从 websocket 教程中复制的方法,但我不明白 observable 中“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】:

为了创建 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');
  ;
);

当然,您可以使用arrow function expression 拥有:

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

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

尝试以下代码来测试 Observable:

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

最后,subscription.unsubscribe() 将删除您示例中的套接字连接。

在此处查找使用这些示例运行的项目:https://stackblitz.com/edit/typescript-observable-unsubscribe

如果有帮助,请告诉我!

【讨论】:

以上是关于Angular Observables 返回匿名函数的主要内容,如果未能解决你的问题,请参考以下文章

Angular2 Observables - 创建我自己的 - 订阅者未定义

在 Angular2 中使用 RxJS 链接 observables

将返回的 Observables 转换为角度的自定义类数组

Angular 2 observables:防止组件的变化冒泡

q.all 用于 angular2 observables

Angular 6 / Rxjs - 如何基础:observables 成功,错误,最后