代码之家  ›  专栏  ›  技术社区  ›  Sharikov Vladislav

在通过算子进行变换之前是否可能获得可观察性?

  •  1
  • Sharikov Vladislav  · 技术社区  · 9 年前

    有可能吗?

    更详细的问题

    const source = Rx.Observable.interval(500);
    const transformed = source.mergeMap(() => Rx.Observable.timer(100));
    

    transformed 可观察的是 source (我无法通过 最初的 (操作员应用前)与操作员转换后可观察到?

    代码:

    @AppendLoader()
    @Effect()
    getFriends$: Observable<Action> = this.actions$
      .ofType(friendsActions.GET_FRIENDS)
      .switchMap(() => {
        return this.friendsService.getFriends()
          .map((data: any) => new friendsActions.GetFriendsSuccessAction(data))
          .catch(() => of(new friendsActions.GetFriendsFailureAction()));
      });
    

    function AppendLoader() {
      return function (target: any, propertyKey: string) {
        let observable: any = null;
        Object.defineProperty(target, propertyKey, {
          configurable: true,
          enumerable: true,
          get: () => {
            console.log('get');
            return observable;
          },
          set: (newObservable) => {
            console.log('set', newObservable);
            observable = newObservable;
            observable
              .subscribe((action: any) => {
                console.log(action);
              });
          }
        });
      };
    }
    

    我有三个观察点:

    • this.actions$ (所有动作)
    • this.action$.ofType(friendsActions.GET_FRIENDS) (可观察到的 friendsActions.GET_FRIENDS
    • 第三个可见(第二个和 switchMap 适用于它) GetFriendsSuccessAction / GetFriendsFailureAction )

    getFriends$ 所有物

    showLoader() 例如)。我想订阅第三个可观察值,当发出成功/失败值时,我想隐藏负载微调器。

    1 回复  |  直到 9 年前
        1
  •  1
  •   Artem    9 年前

    我简要检查了RxJs5源代码,似乎这是不可能的。 但对于您的情况,您可以执行以下操作:

    1. second$ = this.actions$.ofType(friendsActions.GET_FRIENDS)
      getFriends$ = second$.switchMap(() => {...});
      
      forDecoratror$ = Observable.Merge(second$.mapTo("2nd"), getFriends$)
      
    2. 当“2nd”出现时,在decorator中调用showloader()

    请记住,一切都是一条小溪:-)