【问题标题】:rxjs: how to create an Observable that yields true on success and false on errorrxjs:如何创建一个在成功时产生 true 并在错误时产生 false 的 Observable
【发布时间】:2018-06-03 03:00:41
【问题描述】:

我想创建一个订阅另一个 Observable 的 Observable,成功时返回 true,出错时返回 false。

这是我的解决方案:

new Observable ((observer: Observer<boolean>) => {
  obs().subscribe (() => {
    observer.next (true);
  }, error => {
    observer.next (false);
  })
});

但我认为必须有一个没有“新 Observable”的更简单的解决方案。 比如:

obs().pipe (
  map (() => true),
  catchError(() => of(false))
);

但这只会留下打字稿错误:

错误 TS2322:类型 'Observable' 不可分配给类型 'boolean |可观察的'。

类型 'Observable' 不可分配给类型 Observable'。

键入'布尔值| {}' 不可分配给类型 'boolean'。

类型“{}”不可分配给类型“布尔”。

我正在使用: rxjs 5.5.2 打字稿2.4.2

【问题讨论】:

    标签: rxjs


    【解决方案1】:

    也许这是导入的问题,现在可以了:

    import {Observable} from 'rxjs/Observable';
    import 'rxjs/add/operator/catch';
    
    obs ().map (() => true).catch (() => Observable.of (false));
    

    【讨论】:

      【解决方案2】:

      您可以尝试捕获异常并返回 false

      obs().catch(()=> of(false))
           .map(value=>{
               if(!value){
                   return false;
               }
               return true;
           );
      

      如果值不真实,则返回 false,如果真实,则返回一个新的可观察值 true。

      【讨论】:

      • 好的,但如果它有效,它比我的第一个解决方案更复杂和令人困惑。
      • 我不同意。此外,它还消除了在您创建的新可观察对象中的订阅,这可能会造成内存泄漏。您很可能能够删除开关映射,而只使用映射。这可能会让它更清楚。
      • 它与我的第二个示例相同,只是反过来。但这不适用于 rxjs 5.5.2。在那里你必须使用管道和catchError。也许我有打字稿问题。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-12-30
      • 1970-01-01
      • 2023-03-05
      • 2014-10-31
      • 2019-04-17
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多