typescript - Typescript 中的 Observable<void> 使用模式

标签 typescript design-patterns rxjs observable void

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

下面是用Observable<void>这些情况的好模式?或者使用 Observable<void> 是否存在可预见的问题?

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
  );

最佳答案

更准确地说,当您定义一个具有通用类型的 Subject 时 void您可以通过两种方式调用它的 next()方法并且没有任何参数:

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

...或使用 void 0 :

subject.next(void 0);

事实上,value next 的参数是可选的,所以如果你不指定它,它会发送 undefined这意味着即使你有 Subject<void> 您仍然会收到 next通知:

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

另请注意,您可以将任何 Observable 转换为 <void> (当你想合并多个 Observables 时这是必要的)map :

source.pipe(map(() => void 0))
   ...

关于typescript - Typescript 中的 Observable<void> 使用模式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46378457/

相关文章:

typescript - VSC 中的 ESLint 不适用于 .ts 和 .tsx 文件

C#,逻辑结构可以使用嵌套类吗?

javascript - 使用 RXJS 过滤数组

javascript - DebounceTime 发出该时间内捕获的所有事件

angular - Ionic2 ion-toggle 在 ionChange 上获得值(value)

angular - 如何在 Intellij 中执行自动 Tslint

c++ - 设计一个多客户端-服务器应用程序,其中客户端不经常发送消息

java - "Extending"实例创建后的匿名类

javascript - 如何获取 RxJS Subject 或 Observable 的当前值?

angular - 如果该文件不存在,我如何指向另一个文件?