我正在尝试编写一个观察值,它会根据鼠标悬停文档将数据库更新为“离开”状态。如果鼠标活动,则更新回“在线”状态。
这是我到目前为止所知道的:
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
});
})
)
);
}
但这对我不起作用。做这件事的方法是什么?
发布于 2018-06-08 04:59:48
你几乎已经拥有它了,真的只需要在几个地方使用subscribe()
。
为了让下面的示例更清晰,我抽象出了Firebase代码,出于演示目的,我用一个console.log()
替换了它。
我还将timer(5000).map()
更改为pipeable格式,因为上面已经有了.pipe()
。如果您有正确的导入,那么它应该以任何一种方式工作,但最好保持所有内容的一致性。
最后,我删除了first()
,因为我认为代码应该随着时间的推移不断监视鼠标。
现在,您可以在控制台中看到,当鼠标以各种模式移动时,Firebase将看到什么。
下一个增强可能是在已经在线的情况下抑制“在线”更新,但这取决于您的需求。
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();
<script src="https://cdnjs.cloudflare.com/ajax/libs/rxjs/6.2.0/rxjs.umd.js"></script>
https://stackoverflow.com/questions/50744593
复制相似问题