是否有可能在通过运算符转换之前获得可观察性?

时间:2017-08-01 19:25:16

标签: angular rxjs ngrx ngrx-store ngrx-effects

有可能吗?

更详细的问题

我有这样的事情:

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

transformed observable是 new observable,它没有连接到初始可观察source(我认为我无法通过transformed访问它。在用运算符转换后,是否有可能以某种方式得到 initial (在运算符应用之前)observable?

我的案例

代码:

@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()));
  });

和AppendLoader:

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 $ this.action$.ofType(friendsActions.GET_FRIENDS)创建(friendsActions.GET_FRIENDS类型的可观察对象)
  • 第三个可观察(第二个和switchMap适用于它)(GetFriendsSuccessAction / GetFriendsFailureAction的可观察量)

我只能访问装饰器中的第3个observable,因为这个observable位于getFriends$属性中。

我想在AppendLoader装饰器中做一些动作。我想订阅列表中的第二个observable,当发出值时,我想显示加载微调器(例如showLoader())。我想订阅第三个observable,当发出成功/失败值时,我想隐藏加载微调器。

1 个答案:

答案 0 :(得分:1)

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

  1. 创建新的可观察'forDecoratror $':

    second$ = this.actions$.ofType(friendsActions.GET_FRIENDS)
    getFriends$ = second$.switchMap(() => {...});
    
    forDecoratror$ = Observable.Merge(second$.mapTo("2nd"), getFriends$)
    
  2. 在装饰者调用showloader()时,“2nd”来了

  3. 请记住,一切都是流: - )