【问题标题】:Complete not getting called in Observable subscribe method完全没有在 Observable 订阅方法中被调用
【发布时间】:2018-09-19 11:02:53
【问题描述】:

我正在开发 Angular 应用程序,我正在尝试使用 RxObservable。下面是示例代码。

getMyData(){
 console.log('get my account data called');
  this.AccountService
    .getMyAccountData()
    .filter(_res => _res !== null)
    .takeUntil(this.ngUnsubscribe)
    .subscribe({
        next: _response => {console.log('call finished');}
        error: error => {
            console.log('had an error');
            handleHttpError(error);
       },
       complete: () => {
           console.log('account data loaded is being set');
           this.accountDataLoaded = true;
       }
    });
}

现在这是一个 Angular 2 应用程序(单页应用程序)。当我重新加载页面时,上述函数的完整部分被调用并且 this.accountDataLoaded 为真。

但是,如果我移动到其他组件并返回到这个组件,则不会调用 complete 并且 accountDataLoaded 保持为 false。

我看到控制台上也没有错误,因为我正在记录错误,正如您在上面看到的那样。

我认为该 observable 上的 filter 或 takeUntil 函数会导致该问题,但我不确定。

【问题讨论】:

  • 告诉我们你在哪里调用这个函数,也告诉我们ngUnsubscribe
  • 您能告诉我们您是如何设置组件的以及如何在其中调用此方法吗?
  • 我不确定为什么 complete 在没有更多上下文的情况下不会被触发,但如果这是来自 HTTP 调用的可观察对象,则 HTTP 可观察对象总是触发一次然后完成,因此您通常不会除了success 之外,还需要使用complete 回调。
  • 由于这里您没有保存此订阅,因此 ngUnsubscribe 不在上下文中。无论调用多少次,帐户数据都“不应”为空。在服务调用中放置一个调试器,看看它是否被正确命中。看起来其他一些条件正在阻止调用甚至发生
  • 您也可以注释掉过滤器和 takeUntill 调用,以查看您的服务调用是否在其他情况下发生......只是为了查明可能是什么问题

标签: javascript angular rxjs angular2-directives angular-observable


【解决方案1】:

如果调用错误,则不会调用 RXjs 行为完成。 在您的情况下,您需要执行以下操作。

  getMyData(){
 console.log('get my account data called');
  this.AccountService
    .getMyAccountData()
    .filter(_res => _res !== null)
    .takeUntil(this.ngUnsubscribe)
    .subscribe({
        next: _response => {console.log('call finished');}
        error: error => {
            console.log('had an error');
            handleHttpError(error);
       },
       complete: () => {
           console.log('account data loaded is being set');
           this.accountDataLoaded = true;
       }
    }).add(() => {
         //Called when operation is complete (both success and error)
    });
}

【讨论】:

    猜你喜欢
    • 2017-12-19
    • 2017-03-24
    • 1970-01-01
    • 2021-12-29
    • 2018-12-21
    • 1970-01-01
    • 2014-01-19
    • 2021-01-16
    • 1970-01-01
    相关资源
    最近更新 更多