我的问题与Angular router bug无关。
我有一个可以拖放的组件。拖放功能的代码如下所示:
@HostListener('mousedown')
onMousedown(): void {
const mousemove$ = Observable.fromEvent(document, 'mousemove');
const mouseup$ = Observable.fromEvent(document, 'mouseup');
const modifiedMouseMove$ = mousemove$
.map(some transformations)
.takeUntil(mouseup$);
modifiedMouseMove$.subscribe(do something on each move);
modifiedMouseMove$.last().subscribe(drop the item)
}
如果我只是"点击"关于这个项目,我得到:
Error: EmptyError { message: 'no elements in sequence', ... }
我假设问题是,当我点击时,它会触发mousedown -> mouseup
,其间没有mousemove
个事件。导致modifiedMouseMove$
成为"空"并且对.last()
的调用不会返回任何内容。此错误不会影响我的应用程序的功能。我能抓住它,什么都不做:
modifiedMouseMove$.last().subscribe(() => drop the item, (err) => {
if (err.name === 'EmptyError') {
return;
} else {
throw err;
}
});
现在它不再出现在控制台中,但故意吞下错误似乎......糟糕。 如何实际处理错误?
如果没有鼠标移动,我是否应该激活第二个订阅(使用last()
运算符)?如果是这样,最好的方法是什么?
是否有一个神奇的操作员,只有在有事件时才会订阅,否则会留下可观察到的寒冷?
答案 0 :(得分:2)
如果您只想要一个Observable中的最后一个项目,那么当没有时,您最好使用takeLast(1)
运算符:
modifiedMouseMove$.takeLast(1).subscribe(...)
last()
和first()
运算符只需要一个匹配项。任何其他情况都会导致错误通知。
答案 1 :(得分:1)
同意马丁的回答。如果即使在尝试发出最后一个元素后仍然获得空元素,也会在 defaultIfEmpty
之后添加一个 takeLast(1)
if case。
例如, takeLast(1).defaultIfEmpty(element).subscribe()