如何处理“EmptyError:序列中没有元素”?

vin*_*nce 4 rxjs angular

我的问题与Angular 路由器错误无关。

我有一个可以拖放的组件。拖放功能的代码如下所示:

@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()如果没有鼠标移动,我是否应该不激活第二个订阅(与操作员一起)?如果是这样,最好的方法是什么?

是否有一个神奇的运算符,仅在有事件发生时才会订阅,否则将可观察到的冷处理?

mar*_*tin 5

如果你只想要 Observable 中的最后一个项目,并且没有的话,最好使用运算符takeLast(1)

modifiedMouseMove$.takeLast(1).subscribe(...)
Run Code Online (Sandbox Code Playgroud)

last()运算first()符需要且只有一个匹配项。任何其他情况都会导致错误通知。