unsubscribe 不是 observable 上的函数

Posted

技术标签:

【中文标题】unsubscribe 不是 observable 上的函数【英文标题】:unsubscribe is not a function on an observable 【发布时间】:2017-05-02 15:28:21 【问题描述】:

我正在制作一个拖放应用程序,并创建了一个可观察到鼠标位置的可观察对象,它重新定位了我的 drag-object

mouseMove$: any;

constructor()
  this.mouseMove$ = Observable.fromEvent(document, 'mousemove')
    .do((mouseevent: MouseEvent) => 
      if (document.getElementById("drag-object"))
        document.getElementById("drag-object").style.left = (mouseevent.clientX) + 'px';
        document.getElementById("drag-object").style.top = (mouseevent.clientY) + 'px';
      
  );

有了这个实现,我以这种方式订阅没有问题:

this.mouseMove$.subscribe();

但我似乎无法退订:

this.mouseMove$.unsubscribe();

this.mouseMove$.dispose();

在任何一种情况下,我都会收到以下类型的错误:

TypeError: this.mouseMove$.unsubscribe 不是函数...

我不确定这是否与anymouseMove$ 类型有关,但是将类型设置为ObservableObservable<MouseEvent> 不起作用。我在这里不明白什么?

【问题讨论】:

【参考方案1】:

您可能正在使用较新版本的 RxJS,其中有一个 API 更改,其中 Observable.subscribe 返回一个 Disposable,您现在从中调用 .unsubscribedispose 在 RxJS5 中变为 unsubscribe) .不幸的是,仍然有很多旧教程和博客文章以“旧方式”进行操作,导致了这种混乱。

因此,您的代码应该是

let disposeMe = this.mouseMove$.subscribe();

完成后

disposeMe.unsubscribe();

有关从版本 4 到 5 的 API 更改的完整列表,请查看this file。

【讨论】:

【参考方案2】:

确保您的 this.mouseMove$ 是可观察的第一:

if (this.mouseMove$ !== undefined) 
  this.mouseMove$.unsubscribe();

在您的情况下,您可能在 this.mouseMove$ 尚未被分配任何值之前取消订阅。

【讨论】:

【参考方案3】:
  this.getValue= this.ntUser.salesEnquiry()
      .subscribe(
        (result) => 
    // some action
          this.getdataapi.unsubscribe();
        ,
        (error) => 
          // some action
        
      );
  

【讨论】:

请解释 OP 面临问题的原因以及您的答案如何解决它。【参考方案4】:

看看brianflove.com。

通过设置 mouseMove$:ISubscription,应该可以解决这个问题。

【讨论】:

你能用核心描述修改答案吗? 不使用“mouseMove$:any”,将数据类型声明为 ISubscription,将消除您看到的错误。

以上是关于unsubscribe 不是 observable 上的函数的主要内容,如果未能解决你的问题,请参考以下文章

.unsubscribe 和 .take(1) 的区别

Angular4最佳实践之unsubscribe

具有更改功能的观察者模式

Firebase onAuthStateChanged unsubscribe 不是函数错误

rx.js Observable 剖析(创建,订阅,执行,清理 )

React Native unsubscribe.current 不是一个函数