簡體   English   中英

rxjs / angular4可觀察的優化

[英]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()不建議,因為你只是交換“回調地獄”與“地獄訂閱”。 此外,您正在丟失errorcomplete來自父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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM