完全没有在 Observable 订阅方法中被调用

Posted

技术标签:

【中文标题】完全没有在 Observable 订阅方法中被调用【英文标题】:Complete not getting called in Observable subscribe method 【发布时间】: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 调用,以查看您的服务调用是否在其他情况下发生......只是为了查明可能是什么问题 【参考方案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)
    );

【讨论】:

以上是关于完全没有在 Observable 订阅方法中被调用的主要内容,如果未能解决你的问题,请参考以下文章

RxJava Observable.create 包装可观察订阅

Angular 2 方法没有订阅 observable

Route Resolver 在没有订阅的情况下不会触发 observable

内部地图没有在 Rxjs 中被调用

每当我的 Apollo 订阅在 React 中被触发时,我如何调用函数?

创建一次性订阅