[英]rxjs/angular4 observable optimization
我对observables有一个优化问题:
我有两个接受用户名和密码的控件。 当密码字段的值发生变化(带有去抖动)时,我想调用一个返回查询结果的可观察对象的服务方法,并用这些值填充模型。
返回的observable在服务错误的情况下抛出异常。 但是我想在这种情况下用空数组填充模型。
我原来的实施:
this.passwordControl.valueChanges
.debounceTime(500)
.filter(_ => this.usernameControl.valid && !this.usernameControl.pristine)
.map((password) => new RequestAuthentication(this.usernameControl.value, password))
.mergeMap(auth => this.orgService.getOrganizations(auth))
.catch(_ => {
return Observable.of([]);
})
.subscribe(orgs => {
this.organizations = orgs;
});
缺点是当执行catch函数时,我返回一个完成流的有限observable,我不能再听取更改了。
我的解决方案是嵌套observables:
this.passwordControl.valueChanges
.debounceTime(500)
.filter(_ => this.usernameControl.valid && !this.usernameControl.pristine)
.map((password) => new RequestAuthentication(this.usernameControl.value, password))
.subscribe(auth => {
this.orgService.getOrganizations(auth)
.catch(_ => Observable.of([]))
.subscribe(orgs => {
this.organizations = orgs;
});
});
但这似乎没有反应......我该如何避免这些嵌套的observable并保持代码干净?
在全体呼叫subscribe()
内的另一个subscribe()
不建议,因为你只是交换“回调地狱”与“地狱订阅”。 此外,您正在丢失error
并complete
来自父Observable链的信号。 尽管如此,你总是可以避免它。
因此,如果您不想在发生错误时结束链,那么有一些运营商可以帮助您。 具体来说: retry()
和retryWhen()
(也是onErrorResumeNext()
)可能更多。
如果您在发生错误信号时不想执行任何操作,请使用retry()
而不是catch()
:
.mergeMap(...)
.retry()
.subscribe(orgs => {
this.organizations = orgs;
});
如果您仍希望能够执行一些副作用(通知用户或其他.do()
在retry()
之前使用.do()
retry()
:
.mergeMap(...)
.do(null, e => ...)
.retry()
.subscribe(orgs => {
this.organizations = orgs;
});
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.