【问题标题】:ERROR EmptyErrorImpl {message: "no elements in sequence", name: "EmptyError"} in Angular 7错误 EmptyErrorImpl {消息:“序列中没有元素”,名称:Angular 7 中的“EmptyError”}
【发布时间】:2019-08-18 04:43:12
【问题描述】:

我在尝试从特定组件导航到不同路线时遇到一个奇怪的错误。如果我从其他组件导航到不同的路线,我不会看到此错误。 我附上错误的屏幕截图

我已经搜索过这个问题,似乎是 RxJS 或空路由的问题。但是我在空路由中添加了 pathMatch:'full',而我的 RxJS 版本是 6.3.3。任何想法或任何人在这里解决了同样的问题可能会有很大的帮助。

【问题讨论】:

  • 查看堆栈跟踪,您可能在某处有一个first 管道,以及takeUntil。您的 takeUntil 通知程序(在 ngOnDestroy @ TextblockComponent 中)在 Observable 发出第一个值之前关闭它,从而导致 EmptyError。将您的管道更改为 take(1) 而不是 first()
  • @ggradnig 帮助很大。请将其发布为我会接受的答案。再次非常感谢
  • 当然可以。不客气!
  • 任何人都有一个很好的方法来确定是哪个first() 触发了这个问题。我有我的想法(在创建时创建堆栈跟踪并将其作为错误的一部分抛出),但不确定如何在不分叉所有内容的情况下以一种好的方式做到这一点。

标签: angular rxjs angular-routing angular7 rxjs6


【解决方案1】:

如果源 observable 在发出任何通知之前关闭,first 管道会抛出EmptyError

您的堆栈跟踪显示TextblockComponent 在其ngOnDestroy 函数中触发了一个takeUntil 管道,该管道通常会关闭一个Observable。可以假设这会关闭具有first 管道的Observable,从而导致EmptyError

可以通过使用take(1) 而不是first() 来规避该错误。

【讨论】:

    【解决方案2】:

    这是关于此类错误的最受欢迎的问题(也是自“pathMatch: 'full'”错误现已修复以来更现代的问题之一),所以我想提供那些无法解决的问题用 ggradnig 的回复找到解决方案(虽然一般来说是这样)。

    看看你的拦截器

    如果您的 HTTP 请求在发出之前被拦截器拦截,并且该拦截器由于某种原因失败,您的请求将被卡住。

    举一个我最近两天调试的例子:如果您使用 JWT 身份验证,那么您很可能在某处有一个拦截器将您的访问令牌附加到 AJAX 请求,因此您不必手动执行所有操作时间。如果这个拦截器抓取了你的请求,而你没有编写任何逻辑代码,如果他们没有找到要附加到请求的令牌,你可能会发现自己遇到了这个错误。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-04-02
      • 1970-01-01
      • 2018-05-16
      • 2019-03-21
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多