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

时间:2018-02-14 14:31:07

标签: angular rxjs

我的问题与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()运算符)?如果是这样,最好的方法是什么?

是否有一个神奇的操作员,只有在有事件时才会订阅,否则会留下可观察到的寒冷?

2 个答案:

答案 0 :(得分:2)

如果您只想要一个Observable中的最后一个项目,那么当没有时,您最好使用takeLast(1)运算符:

modifiedMouseMove$.takeLast(1).subscribe(...)

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

答案 1 :(得分:1)

同意马丁的回答。如果即使在尝试发出最后一个元素后仍然获得空元素,也会在 defaultIfEmpty 之后添加一个 takeLast(1) if case。

例如, takeLast(1).defaultIfEmpty(element).subscribe()