首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何编写取消订阅自身的observable rxjs6 Angular6

如何编写取消订阅自身的observable rxjs6 Angular6
EN

Stack Overflow用户
提问于 2018-06-07 23:06:50
回答 1查看 80关注 0票数 1

我正在尝试编写一个观察值,它会根据鼠标悬停文档将数据库更新为“离开”状态。如果鼠标活动,则更新回“在线”状态。

这是我到目前为止所知道的:

代码语言:javascript
复制
private updateOnIdle(userId) {
  this.timer$ =  fromEvent(document, 'mousemove')
                       .pipe(
                        first(),
                        throttleTime(2000),
                        switchMap(() => firebase.database()
                        .ref(`/status/${userId}`).set({status: 'online', last_changes: firebase.database.ServerValue.TIMESTAMP}),
                        ),
                        map(() =>
                        timer(5000)
                        .map(() => {
                          firebase.database().ref('/status/' + userId).set({
                            status: 'away',
                            last_changed: firebase.database.ServerValue.TIMESTAMP
                        });
                        })
                      )
                      );
}

但这对我不起作用。做这件事的方法是什么?

EN

回答 1

Stack Overflow用户

发布于 2018-06-08 04:59:48

你几乎已经拥有它了,真的只需要在几个地方使用subscribe()

为了让下面的示例更清晰,我抽象出了Firebase代码,出于演示目的,我用一个console.log()替换了它。

我还将timer(5000).map()更改为pipeable格式,因为上面已经有了.pipe()。如果您有正确的导入,那么它应该以任何一种方式工作,但最好保持所有内容的一致性。

最后,我删除了first(),因为我认为代码应该随着时间的推移不断监视鼠标。

现在,您可以在控制台中看到,当鼠标以各种模式移动时,Firebase将看到什么。

下一个增强可能是在已经在线的情况下抑制“在线”更新,但这取决于您的需求。

代码语言:javascript
复制
console.clear()

fromEvent = rxjs.fromEvent
first = rxjs.operators.first
throttleTime = rxjs.operators.throttleTime
switchMap = rxjs.operators.switchMap
map = rxjs.operators.map
timer = rxjs.timer
of = rxjs.of

userId = 1

/*
setStatus = (newStatus, userId) => {
  return firebase.database()
    .ref(`/status/${userId}`)
    .set({
      status: newStatus, 
      last_changed: firebase.database.ServerValue.TIMESTAMP
    })
}
*/

setStatus = (newStatus, userId) => { 
  console.log(newStatus, userId)
  return of(1)
}

timer$ = fromEvent(document, 'mousemove').pipe(
  //first(),
  throttleTime(2000),
  switchMap(() => setStatus('online', userId)),
  map(() =>
    timer(5000).pipe(
      map(() => setStatus('away', userId))
    ).subscribe()
  )
);

timer$.subscribe();
代码语言:javascript
复制
<script src="https://cdnjs.cloudflare.com/ajax/libs/rxjs/6.2.0/rxjs.umd.js"></script>

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50744593

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档