【问题标题】:Observable<void> usage pattern in TypescriptTypescript 中的 Observable<void> 使用模式
【发布时间】:2018-03-04 20:15:39
【问题描述】:

当异步服务没有返回值但我想使用 Observables 时,我倾向于使用 Observable&lt;boolean&gt;。但我对这个布尔值没有意义,因为服务要么失败,要么成功,如果失败,我希望 Observable 处于错误状态。这只会为观察到的布尔值留下“真实”值。

对于这些情况,Observable&lt;void&gt; 的以下用法是一个好的模式吗?或者Observable&lt;void&gt;的使用有没有可以预见的问题

const asyncFuncWithoutResult = (): Observable<void> => {
  // fake something async that has no return value

  const itWorked = true; // or not
  if (itWorked) {
    return Observable.of();
  } else {
    return Observable.throw(Error('It did not work'));
  }
}

// call the service
asyncFuncWithoutResult()
  .subscribe(
    undefined, // nothing will be emitted when using Observable.of()
    (err: any) => console.error(err), // handle error state
    () => console.log('Success'),     // handle success state
  );

【问题讨论】:

  • 我看不到任何明显的问题。如果您遇到需要发出任意值的情况,您始终可以使用concatObservable.of 发出您想要的任何值。例如。 asyncFuncWithoutResult().concat(Observable.of("success!")).
  • 谢谢,这是一个非常有用的提示。

标签: typescript design-patterns rxjs observable void


【解决方案1】:

更准确地说,当您定义泛型类型为 void 的 Subject 时,您可以通过两种方式调用其 next() 方法,即不带任何参数:

const subject = new Subject<void>();
subject.next();

...或void 0:

subject.next(void 0);

事实上,nextvalue 参数是可选的,所以如果你不指定它,它会发送 undefined,这意味着即使你有 Subject&lt;void&gt; 你仍然会收到next 通知

asyncFuncWithoutResult().subscribe(alawaysUndefined => {
  /* ... */
});

另外请注意,您可以通过mapmapTo 将任何 Observable 转换为 &lt;void&gt;(当您想要合并多个 Observable 时这是必要的):

source.mapTo(void 0)
   ...

【讨论】:

  • 感谢您的额外见解,非常有帮助。如果主题.next();导致发出“未定义”是否有意义,类似于此 Observable.of() 不会返回一个发出“未定义”的 Observable?
  • 我认为这是两个不同的东西。拥有一个不发出任何next 并且只发送complete 通知的Observable 是非常好的,就像Observable.of() 所做的(或Observable.empty)一样。另一方面,让subject.next() 什么都不做是没有意义的,因为当你知道它不会做任何事情时调用这个方法有什么意义?出于同样的原因,没有任何 Observable 不会发出任何 nextcompleteerror 通知,因为为什么会有人想要使用它们。
猜你喜欢
  • 2018-12-17
  • 2023-03-26
  • 2019-09-19
  • 1970-01-01
  • 2019-11-21
  • 2023-04-07
  • 2018-12-25
  • 1970-01-01
  • 2017-11-13
相关资源
最近更新 更多