[英]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.