繁体   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