我有一个可以拖放的组件。拖放功能的代码如下所示:
@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)
}
Run Code Online (Sandbox Code Playgroud)
如果我只是“单击”该项目,我会得到:
Error: EmptyError { message: 'no elements in sequence', ... }
Run Code Online (Sandbox Code Playgroud)
我假设问题是当我单击时,它会触发 a ,其间mousedown -> mouseup
没有任何事件。mousemove
导致modifiedMouseMove$
为“空”并且调用.last()
不返回任何内容。此错误不会影响我的应用程序的功能。我可以抓住它而不做任何事情:
modifiedMouseMove$.last().subscribe(() => drop the item, (err) => {
if (err.name === 'EmptyError') {
return;
} else {
throw err;
}
});
Run Code Online (Sandbox Code Playgroud)
现在它不再显示在控制台中,但故意吞下错误似乎......很糟糕。我实际上如何处理该错误?
last()
如果没有鼠标移动,我是否应该不激活第二个订阅(与操作员一起)?如果是这样,最好的方法是什么?
是否有一个神奇的运算符,仅在有事件发生时才会订阅,否则将可观察到的冷处理?
如果你只想要 Observable 中的最后一个项目,并且没有的话,最好使用运算符takeLast(1)
:
modifiedMouseMove$.takeLast(1).subscribe(...)
Run Code Online (Sandbox Code Playgroud)
和last()
运算first()
符需要且只有一个匹配项。任何其他情况都会导致错误通知。
归档时间: |
|
查看次数: |
4636 次 |
最近记录: |