完全没有在 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 包装可观察订阅
Route Resolver 在没有订阅的情况下不会触发 observable